Prenez le temps aujourd'hui de résumer certains algorithmes de tableaux couramment utilisés en JavaScript, afin de pouvoir les utiliser dans des entretiens écrits ou dans des processus de développement quotidiens. Certains algorithmes proviennent d’Internet et sont résumés ici. Je joindrai la source de la référence à la fin de l'article. S'il est ennuyeux de regarder l'algorithme directement, vous pouvez le lire dans la littérature de référence. L'explication est très bonne.
1. Déduplication de la baie
Méthode 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; }
Méthode 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; }
Méthode 3 :
//Comparez les éléments adjacents après le tri, s'ils sont identiques, abandonnez, sinon ajoutez au résultat. Le même problème que la méthode 2 se produira. S'il y a des situations telles que 1,1, '1' dans le tableau, un dépannage se produira
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; }
Méthode 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; }
Méthode 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. Perturbation de la commande des tableaux
Méthode 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; };
Méthode 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; }
Méthode 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. Jugement du tableau
Méthode 1 :
//自带的isArray方法 var array6 = []; Array.isArray(array6 );//true
Méthode 2 :
//利用instanceof运算符 var array5 = []; array5 instanceof Array;//true
Méthode 3 :
//利用toString的返回值 function isArray(o) { return Object.prototype.toString.call(o) === '[object Array]'; }
4. Trouver l'intersection des tableaux
Méthode 1 :
//利用filter和数组自带的indexOf方法 array1.filter(function(n) { return array2.indexOf(n) != -1 });
5. Union des tableaux
Méthode 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. Ensemble de différences de tableau
Méthode 1 :
//利用filter和indexOf方法 Array.prototype.diff = function(a) { return this.filter(function(i) { return a.indexOf(i) < 0; }); };
La méthode 1 ci-dessus ne peut trouver que la différence entre un tableau et un autre tableau. Par exemple, array1.diff(array2) ne peut trouver que la différence entre array1 et array2. deux tableaux, pour l'obtenir, vous pouvez array1.diff(array2).concat(array2.diff(array1)), ou vous pouvez utiliser la méthode 2
Méthode 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 );
Ceci est résumé pour l'instant et sera ajouté plus tard. Tout le monde est invité à ajouter. Si vous avez des questions, veuillez laisser un message pour discuter et progresser ensemble ^_^
.