aermin / blog

📝 My blog / notes

Home Page:https://www.aermin.top/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

js数组去重(2018.02.05)

aermin opened this issue · comments

不用api

思路
1.构建一个新的数组存放结果
2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比
3.若结果数组中没有该元素,则存到结果数组中

code

Array.prototype.arrUnique_for = function () { 
         let res = [this[0]]; 
         let flag = false; 
         for (let i = 1; i < this.length; i++) { 
             for (let j = 0; j < res.length; j++) { 
                 if (this[i] === res[j]) { 
                      flag = true; 
                      break;
                 }
             } 
             if (!flag) { 
               res.push(this[i]); 
             }
        flag = false; 
       }
       return res; 
}

用ES5

用indexOf的常规操作

思路
建一个空的临时数组,遍历传进来的参数(数组),并用临时数组.indexOf对数组的每一个值做判断,等于 -1表示临时数组没有这个值且收下这个值,否则表示已经有一个这个值了,拒收。
最后,临时数组就是我们要的去重后的数组。

code

function unique(arr) {
   var n = [];
   for (var i = 0; i < arr.length; i++) {
       if (n.indexOf(arr[i]) == -1) n.push(arr[i]);
   }
   return n;
 };
 var arr=[1, 2, 1, 1, '1'];
 console.log(unique(arr)); //[1, 2, "1"]

稍微优化一下

code

Array.prototype.unique = function() {
  var n = [];  //一个新的临时数组
  for (var i = 0; i < this.length; i++)  {  //遍历当前数组
      if (n.indexOf(this[i]) == -1) n.push(this[i]);    //如果当前数组的第i已经保存进了临时数组,那么跳过,否则把当前项push到临时数组里面
  }
  return n;
};
var arr=[1, 2, 1, 1, '1'];
console.log(arr.unique()); //[1, 2, "1"]

备注:

①Array.prototype 属性表示 Array 构造函数 [] 的原型 ,也就是[]是Array的一个实例, 所以本例子中 arr继承了Array.prototype的unique方法,且unique方法的this指向arr。
Array.prototype
js中 [].slice 与 Array.prototype.slice 有什么区别?

用ES6

常规操作

code

function unique(array) {
   return Array.from(new Set(array));
}
var array = [1, 2, 1, 1, '1'];
console.log(unique(array)); // [1, 2, "1"]

备注:
①Array.from() 方法从一个类似数组或可迭代对象中创建一个新的数组实例。
②ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
长这样
screenshot.png

极简操作

code

var unique = (a) => [...new Set(a)]  
var array = [1, 2, 1, 1, '1'];
unique(array)

备注:

① 扩展运算符(spread)是三个点(...)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列 数组的扩展