Notes for a front-end developer, esyou.net

0%

JAVASCRIPT中数组去重的多种方法

数组去重,简单来说就是一个数组中如果同时存在两个相同的值,但是我们只需要其中一个即可,不需要将两个相同的值都一起展示出来,这个时候就必须得使用到javascript的数组去重方法了,在javascript中并没有专门的方法直接去重的,因此我们得自己来写一个这样的方法。下面我仅介绍其中的容易理解的4种方法,当然还有其他更多的方法,希望大家能够自己去寻找和学习了,因为目前我就仅能理解这3种方法。
大概的思路应该是这样的:
1)、定义一个变量数组 res 保存结果,遍历需要去重的数组,如果该元素已经存在在 res 中了,则说明是重复的元素,如果没有,则放入 res 中。
2)、将原数组中重复元素的最后一个元素放入结果数组中
下面我们直接来看代码,代码可以让你一目了然。

万能的for循环

1
var arr = [1,2,3,1,2,'1','3','3'];
2
function uniqueTwo(arr) {
3
  var res = [];
4
  for(var i=0; i < arr.length; i++){
5
    var item = arr[i]
6
    res.indexOf(item)===-1 && res.push(item)
7
  }
8
  return res;
9
}
10
var testTwo = uniqueTwo(arr);
11
console.log('testTwo',testTwo); // 返回[1, 2, 3, "1", "3"]

以上代码,我们可以分析得到,首先我们遍历整个数组,将得到的值通过indexOf(首次出现的位置)得到字符第一次出现的位置,如果没有出现过则会返回-1,那么说明数组中仅包含一个此类字符,接着将其push到一个新的数组中即可。

使用indexOf与filter(代码更加简洁)

filter() 方法是创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
filter使用方法 array.filter(function(currentValue,index,arr), thisValue)
currentValue 必须。当前元素的值
index 可选。当期元素的索引值
arr 可选。当期元素属于的数组对象
thisValue 可选。对象作为该执行回调时使用,传递给函数,用作 “this” 的值。如果省略了 thisValue ,”this” 的值为 “undefined”

1
var arr = [1,2,3,1,2,'1','3','3'];
2
function uniqueThree(arr) {
3
  return arr.filter(function (item, index, array) {
4
    return array.indexOf(item) === index;
5
  })
6
}
7
var testThree = uniqueThree(arr);
8
console.log('testThree',testThree); //返回[1, 2, 3, "1", "3"]

使用filter来创建一个新数组,并且此数组中使用indexOf来进行去重即可

先将数组进行排序后,在进行对比

1
var b = [1,1,1,2,2,8,8,9,9,0,32,13,1,2,3,4,5,6,7,8,9,0];
2
b.sort();
3
var res = []
4
for(var i=0;i<b.length;i++){
5
  if(b[i+1] != b[i]){
6
    res.push(b[i])
7
  }
8
}
9
console.log(res)//[0, 1, 13, 2, 3, 32, 4, 5, 6, 7, 8, 9]

ES6中的强大方法

在ES6中,我们可以直接通过Array.from()方法创建一个新数组,Array.from()很像slice方法,但是我们还可以使用Set方法。直接看代码

1
var arr = [1,2,3,1,2,'1','3','3'];
2
function unique(arr){
3
  return Array.from(new Set(arr))
4
}
5
var test = unique(arr);
6
console.log(test); //返回[1, 2, 3, "1", "3"]

甚至,外面可以将ES6直接简写成如下代码

1
var arr = [1,2,3,1,2,'1','3','3'];
2
var unique = (arr)=>{
3
  [...new Set(arr)]
4
}

是不是感觉ES6更加强大?什么,你还不会ES6?赶快加紧学习吧,再不学习新技术,你就落伍了!