摘要:問題起因姐毫無征兆的在我們的水群里發來一段代碼她的目的是想從中隨機抽取個不重復的值組成一個新數組問我代碼是否有問題很遺憾因為我剛睡醒隨便貼了一下代碼運行了一下就說沒問題很快我就被打臉了也是如果沒問題的話她問個毛大家可以先找一下問題下面先
1.問題起因
W姐毫無征兆的在我們的水群里發來一段代碼:
var arr = [{q:"1+1=?",a:"2",b:"3",c:"1"},{q:"1+2=?",a:"2",b:"3",c:"7"},{q:"1+0=?",a:"8",b:"3",c:"1"},{q:"1+7=?",a:"8",b:"3",c:"7"},{q:"2+2=?",a:"4",b:"7",c:"1"},{q:"1+3=?",a:"2",b:"4",c:"6"},{q:"1+70=?",a:"72",b:"73",c:"71"},{q:"1+18=?",a:"22",b:"19",c:"21"},{q:"7+11=?",a:"18",b:"23",c:"21"}]; var resArr = []; for(var i = 0; i<5; i++){ var index = parseInt(Math.random()*10); resArr.push(arr[index]); for( var j = 0; j她的目的是想從arr中隨機抽取5個不重復的值組成一個新數組resArr.問我代碼是否有問題,很遺憾因為我剛睡醒,隨便貼了一下代碼,運行了一下就說沒問題...很快我就被打臉了(也是,如果沒問題的話她問個毛..).
2.代碼更正
大家可以先找一下問題,下面先更正這段代碼,然后再給出群里剩下兩位大哥的解決方法.首先先貼出更正后的代碼:
for(var i = 0; i<5; i++){ var index = parseInt(Math.random()*arr.length);//限制范圍 resArr.push(arr[index]); //每次只需要最后一個壓入數組的元素resArr[i]與之前所有元素進行比較 //若遇到重復的,將resArr[i]彈出并終止循環即可 for( var j = 0; j錯的原因就是注釋里的,我居然一眼沒看出來,真是深感慚愧...看來不能眼高手低,得多敲代碼了.
3.其它解決方法我們4人水群里me和另外兩位也給出了不同的思路.
3.1水貨me給出的思路作為小水貨的我,當時沒有立刻看出來錯誤的地方,所以直接又寫了一個水水的方法,請大家不要見笑....
function solve(arr,num){ var resArr=[],indexArr=[]; for (var j = 0; j < arr.length; j++) { indexArr[j] = 0; } for(var i=0;i這里主要使用一個數組indexArr作為一個表記錄已經被選擇過值,若出現重復則直接跳過.
3.2YC大神給出的解決方法YC大神作為我們中薪水最高,加班時間最長的,百忙中抽出時間給出了自己的解決方案,在此替W姐感謝過勞肥的YC大神.
function filter(arr, num) { var newArr = []; //隨機刪并返回一個值,因為原數組進行了刪除操作,就避免了查重 var pick = function () { var index = Math.ceil((arr.length * Math.random())) - 1; return arr.splice(index, 1); } for (var i = 0; i < num; i++) { // newArr.push(pick()[0])//這樣寫就不用數組扁平化了 newArr.push(pick()); } return newArr } //數組扁平化 function flatten(arr) { return arr.reduce(function (prev, item) { return prev.concat(Array.isArray(item) ? flatten(item) : item); }, []); } var b=flatten(filter(arr, 5)) console.log(b)因為一開始看到返回值的時候就想到一個叫做數組扁平化的東西,很悲慘的是只記得名字忘記了實現方案,所以趁此復習一下.這個方案不好的一點就是修改了原數組,這樣就無發復用該數組,解決方法是可以在函數中進行一個深拷貝,使用新數組進行操作避免修改原數組.
3.3joker大哥的解決方案joker大哥作為我們中身材和臉最好的,以驕傲的姿態給出了我們幾個公認最優的解決方案.
//核心是隨機排序,對傳入的o進行o.length次的隨機交換,并使用slice進行截取返回 var shuffle = function (o, num) { for (var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x) ; return o.slice(0, 5); }; console.log(shuffle(arr))slice()方法返回原數組的一個淺復制,不修改原數組內容.而且效率也高,只用到了一個for循環,如果說有缺點的話就是可讀性略差一些,下面展開一下:
var newShuffle=function(o,num){ var j,tmp,i=o.length; while(i){ j=parseInt(Math.random() * i); tmp=o[--i]; o[i]=o[j]; o[j]=tmp; } return o.slice(0,num) } console.log(newShuffle(arr,5))4如果大家發現和我內容差別不大的博客內容那個就是w姐的博客..欺負我打字慢..
W姐的博客地址
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93796.html
摘要:數組去重是實際應用中常用的操作,出現在面試題中的概率也很高,今天簡述一下和中數組去重的方法數組去重此時未保持原有的順序,對進行排序數組去重如過該元素在數組中第一次出現的位置該元素當前的位置將符合條件的元素加入到中 數組去重 是實際應用中常用的操作,出現在面試題中的概率也很高,今天簡述一下 Python 和 JavaScript 中數組去重的方法 python數組去重 >>> a = [...
摘要:數組去重是實際應用中常用的操作,出現在面試題中的概率也很高,今天簡述一下和中數組去重的方法數組去重此時未保持原有的順序,對進行排序數組去重如過該元素在數組中第一次出現的位置該元素當前的位置將符合條件的元素加入到中 數組去重 是實際應用中常用的操作,出現在面試題中的概率也很高,今天簡述一下 Python 和 JavaScript 中數組去重的方法 python數組去重 >>> a = [...
小編寫這篇文章的主要目的,主要是來給大家解答下關于python數學建模的一些相關的介紹,涉及到內容涵蓋Numpy的一些相關的應用具體的一些介紹。另外,還會涉及到相關的Pandas學習知識,具體內容下面給大家詳細解答下。 1 Numpy介紹與應用 1-1Numpy是什么 NumPy是一個運行速度非常快的數學庫,一個開源的的python科學計算庫,主要用于數組、矩陣計算,包含: 一個強大的...
1、定義 filter() 方法創建一個新數組, 其包含通過所提供函數實現的測試的所有元素?! ?、語法 var newArray = arr.filter(callback(element[, index[, selfArr]])[, thisArg]) 3、參數說明 callback 循環數組每個元素時調用的回調函數。回調函數返回 true 表示保留該元素,false 則不保留...
小編寫這篇文章的一個主要目的,主要是來給大家去做一個介紹。介紹的內容主要是關于建模知識的一些相關介紹,包括其Pandas的一些相關學習,就具體的操作內容,下面就給大家詳細解答下。 Numpy學習 1 Numpy介紹與應用 1-1Numpy是什么 NumPy是一個運行速度非常快的數學庫,一個開源的的python科學計算庫,主要用于數組、矩陣計算,包含: 一個強大的N維數組對象ndarr...
閱讀 784·2021-10-09 09:58
閱讀 648·2021-08-27 16:24
閱讀 1731·2019-08-30 14:15
閱讀 2392·2019-08-30 11:04
閱讀 2080·2019-08-29 18:43
閱讀 2173·2019-08-29 15:20
閱讀 2723·2019-08-26 12:20
閱讀 1622·2019-08-26 11:44