今日は少し時間をとって、JavaScript で一般的に使用される配列アルゴリズムをいくつかまとめて、書面によるインタビューや日常の開発プロセスで使用できるようにしてください。アルゴリズムの一部はインターネットから取得されており、ここにまとめられています。記事の最後に参考文献のソースを添付します。アルゴリズムを直接見るのが退屈な場合は、参考文献を読んでください。説明は非常に優れています。
1. アレイの重複排除
方法 1:
//利用数组的indexOf方法 function unique (arr) { var result = []; for (var i = 0; i < arr.length; i++) { if (result.indexOf(arr[i]) == -1) result.push(arr[i]); } return result; }
方法 2:
//利用hash表,可能会出现字符串和数字一样的话出错,如var a = [1, 2, 3, 4, '3', 5],会返回[1, 2, 3, 4, 5] function unique (arr){ var hash = {},result = []; for(var i = 0; i < arr.length; i++) { if (!hash[arr[i]]) { hash[arr[i]] = true; result.push(arr[i]); } } return result; }
方法 3:
//並べ替え後に隣接する項目を比較し、同じであれば諦め、そうでなければ結果に追加します。配列内に 1,1,'1' のような状況がある場合、方法 2 と同じ問題が発生します
。
function unique (arr) { arr.sort(); var result=[arr[0]]; for(var i = 1; i < arr.length; i++){ if( arr[i] !== arr[i-1]) { result.push(arr[i]); } } return result; }
方法 4:
//最简单但是效率最低的算法,也不会出现方法2和方法3出现的bug function unique (arr) { if(arr.length == 0) return; var result = [arr[0]], isRepeate; for( var i = 0, j = arr.length; i < j; i++ ){ isRepeate = false; for( var k = 0, h = result.length; k < h; k++){ if(result[k] === arr[i]){ isRepeate = true; break; } if(k == h) break; } if( !isRepeate ) result.push(arr[i]); } return result; }
方法 5:
//此方法充分利用了递归和indexOf方法,感谢网友@真爱像深蓝 var unique = function (arr, newArr) { var num; if (-1 == arr.indexOf(num = arr.shift())) newArr.push(num); arr.length && unique(arr, newArr); }
2. 配列の順序の乱れ
方法 1:
//每次随机抽一个数并移动到新数组中 function shuffle(array) { var copy = [], n = array.length, i; // 如果还剩有元素则继续。。。 while (n) { // 随机抽取一个元素 i = Math.floor(Math.random() * array.length); // 如果这个元素之前没有被选中过。。 if (i in array) { copy.push(array[i]); delete array[i]; n--; } } return copy; };
方法 2:
//跟方法1类似,只不过通过splice来去掉原数组已选项 function shuffle(array) { var copy = [], n = array.length, i; // 如果还剩有元素。。 while (n) { // 随机选取一个元素 i = Math.floor(Math.random() * n--); // 移动到新数组中 copy.push(array.splice(i, 1)[0]); } return copy; }
方法 3:
//前面随机抽数依次跟末尾的数交换,后面依次前移,即:第一次前n个数随机抽一个跟第n个交换,第二次前n-1个数跟第n-1个交换,依次类推。 function shuffle(array) { var m = array.length, t, i; // 如果还剩有元素… while (m) { // 随机选取一个元素… i = Math.floor(Math.random() * m--); // 与当前元素进行交换 t = array[m]; array[m] = array[i]; array[i] = t; } return array; }
3. 配列判定
方法 1:
//自带的isArray方法 var array6 = []; Array.isArray(array6 );//true
方法 2:
//利用instanceof运算符 var array5 = []; array5 instanceof Array;//true
方法 3:
//利用toString的返回值 function isArray(o) { return Object.prototype.toString.call(o) === '[object Array]'; }
4. 配列の共通部分を見つけます
方法 1:
//利用filter和数组自带的indexOf方法 array1.filter(function(n) { return array2.indexOf(n) != -1 });
5. 配列の結合
方法 1:
//方法原理:连接两个数组并去重 function arrayUnique(array) { var a = array.concat(array2); for(var i=0; i<a.length; ++i) { for(var j=i+1; j<a.length; ++j) { if(a[i] === a[j]) a.splice(j--, 1); } } return a; };
6. 配列差分セット
方法 1:
//利用filter和indexOf方法 Array.prototype.diff = function(a) { return this.filter(function(i) { return a.indexOf(i) < 0; }); };
上記の方法 1 は、ある配列と別の配列の間の違いのみを見つけることができます。たとえば、array1.diff(array2) は、array1 と array2 の異なる値を比較する場合にのみ見つけられます。 2 つの配列、それを取得するには、array1.diff(array2).concat(array2.diff(array1)) を使用するか、メソッド 2
を使用できます。方法 2
var array1 = new Array(55,55,88,6,68,109,55,33,6,2,1); var array2 = [55,88,99,69,109,55,33,6,2,1]; var diffArr = array1.concat(array2); var diff = diffArr.filter(function(i) { return array1.indexOf(i) < 0||array2.indexOf(i) < 0; }); console.log( diff );
これは今のところまとめられており、後で追加されます。ご質問がございましたら、メッセージを残してください。一緒に議論して進めてください。^_^