Maison >interface Web >js tutoriel >Diverses méthodes pour réaliser la déduplication de tableau dans les compétences javascript_javascript
Pas d’autres bêtises, passons directement aux choses pratiques !
Parlons d'abord des exigences de cet exemple : écrivez une méthode pour réaliser la déduplication de la baie. (Exigences : exécuter la méthode, transmettre un tableau, renvoyer le nouveau tableau après la déduplication, le tableau d'origine reste inchangé, une seule couche de boucles peut être utilisée pendant le processus d'implémentation, des boucles imbriquées à double couche peuvent également être écrites, pour référence uniquement) ;
Tout d'abord, permettez-moi d'expliquer aux débutants ce qu'est la déduplication de tableau (à ignorer pour les vétérans) : cela signifie supprimer les éléments en double dans le tableau, par exemple, var arr = [3,2,4,2,1,2] ; Le nouveau tableau obtenu en dédupliquant le tableau est [3,2,4,1], qui est une telle fonction.
La méthode de mise en œuvre est relativement simple, et il existe de nombreuses façons de la mettre en œuvre. De nombreux experts ont également écrit des articles connexes. Le but de la rédaction de ce blog est d'une part de servir de rappel, et d'autre part de permettre aux débutants de mieux comprendre. le principe de mise en œuvre, d'accord, regardons la première méthode de mise en œuvre :
La première méthode consiste à supprimer les doublons en parcourant le nouveau tableau
var arr = [1,'b','b',4,3,3,4,5,1]; //第一种 Array.prototype.unique1 = function(){ var arr1 = []; //定义一个新数组 for(var i=0;i<this.length;i++){ if(arr1.indexOf(this[i]) == -1){//判断目标数组中在原数组里是否存在 arr1.push(this[i]); } } return arr1; } console.log(arr); //[1,'b','b',4,3,3,4,5,1] console.log(arr.unique1()); //[1, "b", 4, 3, 5] //这种方法的主要思路就是,新建一个数组,然后在原数组中,从第一个开始,看看新数组里面有没有这个元素,如果有,就忽略,然后进行下一个,如果没有,则把这个元素存到新数组里面, //也就是说,每一次比较,都会遍历新数组,直到找到相同元素为止,比较耗性能
Si vous n'êtes pas habitué à cette méthode d'écriture, vous pouvez la changer pour la méthode d'écriture suivante, l'effet est le même :
var arr = [1,'b','b',4,3,3,4,5,1]; function unique1(arr){ var arr1 = []; for(var i=0;i<arr.length;i++){ if(arr1.indexOf(arr[i]) == -1){//判断目标数组中在原数组里是否存在 arr1.push(arr[i]); } } return arr1; } console.log(arr); //[1,'b','b',4,3,3,4,5,1] console.log(unique1(arr)); //[1, "b", 4, 3, 5]
Je ne réécrirai pas la méthode suivante. Vous pouvez la réécrire selon le format ci-dessus, je ne publierai pas le résultat car les commentaires sont écrits dans le code.
Le deuxième type est réalisé grâce aux tables de hachage (ce concept est un peu gros, les principes spécifiques ne seront pas développés ici. Je l'écrirai séparément quand j'aurai le temps. C'est une bonne chose)
var arr = [1,'b','b',4,3,3,4,5,1]; Array.prototype.unique2 = function(){ var hash = {}; //定义一个hash表 var arr1 = []; //定义一个新数组 for(var i=0;i<this.length;i++){ /* 这里比较难理解,我们一步一步来看: hash是一个对象,则存在键值对(key:value),只不过现在是为空的,所以hash[key] = value; 第一步:i=0;this[i]=this[0]=1; hash[this[0]] = hash[1] , 因为hash初始为空,没有找到key=1的值,所以然后undefined, 执行下一步:hash[1] = true(此时hash对象就有了第一组键值对),将原数组的第一个数添加到新数组中,重复第一步 因为不重复的判断hash的值都是undefined,而重复的都为true了,所以不重复都被添加到新数组中 因为hash表存的值是存的地址,放在堆内存中,所以有多少个不重复的元素,就要分多少个内存来存放,所以这种方法比较占内存,但是相比之下,这种的运算运动是最快的, 这也就是用空间来换取时间了,数据量比较小,推荐用此方法 */ if(! hash[this[i]]){ hash[this[i]] = true; arr1.push(this[i]); } } return arr1; } console.log(arr); console.log(arr.unique2());
La troisième méthode est obtenue en déterminant si sa propre position est cohérente
var arr = [1,'b','b',4,3,3,4,5,1]; Array.prototype.unique3 = function(){ var arr1 = []; //定义一个新数组 for(var i=0;i<this.length;i++){ if(this.indexOf(this[i])==i){ //这里也是indexOf遍历,看从第一个元素在原数组中的位置,如果第一次出现的位置和下标相等,说明当前元素的不重复的,如果不等,说明该元素前面已经出现过 arr1.push(this[i]); } } return arr1; } console.log(arr); console.log(arr.unique3());
La quatrième méthode, qui est un peu intéressante, ne peut être utilisée que dans des occasions spéciales. Il s'agit d'abord de trier le tableau, puis de comparer 22 et de générer un nouveau tableau trié
Array.prototype.unique4 = function(){ /* 这里是思路是,先排序(默认从小到大),然后将原数组的第一个给新数组, 因为是经过排序的,所以重复的只会存在在相邻位置 这里就相当于是做22比较,如果相等,则进行下一组,如果不相等,则把这个数存到新数组中,用这个数再进行比较 */ this.sort(); var arr1 = [this[0]]; for(var i=1;i<this.length;i++){ if(this[i] !== arr1[arr1.length-1]){ arr1.push(this[i]); } } return arr1; } console.log(arr); console.log(arr.unique4());
Wow, finissons-en !
Les exigences indiquent également qu'il peut être implémenté en utilisant une boucle imbriquée à double couche. L'inverse est d'utiliser une boucle for à 2 couches et de comparer chacune d'elles avec le tableau d'origine
.Array.prototype.unique5 = function(){ //双层循环,一一比较 for(var i=0;i<this.length;i++){ //从0开始 for(j= i+1;j<this.length;j++){ //从1开始,逐个比较 if(this[i] === this[j]){ //如果恒定 this.splice(j,1); //就将这个元素删掉 } } } return this; } console.log(arr); console.log(arr.unique5());
Cette méthode d'écriture nécessite trop de boucles et n'est pas recommandée. Certains diront, les première et troisième méthodes ne doivent-elles pas également être parcourues à chaque fois ? Oui, vous pouvez le comprendre de cette façon, ce qui signifie que vous le comprenez, mais ce n'est pas une compréhension particulière. Si nous disons que c'est presque la même chose, c'est trop différent. indexOf() signifie que lorsque le premier élément correspondant est trouvé, ce sera
Arrêtez de parcourir, et le type 5 parcourra l'ensemble du tableau, qu'il puisse ou non être trouvé. Si la quantité de données est importante, laquelle, selon vous, a les meilleures performances ?
Une remarque particulière : lorsque vous comparez deux valeurs congruentes ou inégales, veillez à utiliser constante (===) et non constante (!==), car cela impliquera des éléments en termes de type, par exemple exemple, 1 et '1' ne sont pas identiques !
Ce qui précède est une information vraiment sèche, il n'y a pas d'humidité du tout, vous ne pouvez compter que sur tout le monde pour le comprendre !