一个让我耳目一新的数组去重方法

2024-04-30 11:27:21 浏览数 (1)

在以往工作中,一遇到数组去重,一般都会用下面的几个方法

一、双重循环(被去重数组和结果数组)去重

代码语言:js复制
const ary = [];
for (let i = 0; i < array.length; i  ) {
  let isDuplicate = false;
  for (let j = 0; j < i; j  ) {
    if (array[i] === array[j]) {
      isDuplicate = true;
      break;
    }
  }
  if (!isDuplicate) {
    ary.push(array[i]);
  }
}

二、简单对象记录元素是否存在

代码语言:js复制
const result = [];
const tmp = {};
for (let i = 0; i < array.length; i  ) {
  const item = array[i];
  if (!tmp[item]) {
    result.push(item);
    tmp[item] = true;
  }
}

上面两种方法是最原始的去重方法了,现在基本不用了

三、利用ES6的reduce方法去重

代码语言:js复制
const ary = array.reduce((result, current) => {
  return result.includes(current) ? result : [...result, current];
}, []);

这个方法比较常用,因为它可以去重基础数据类型组成的数组,也可以去重对象或数据类型数据组成的数组,如:

代码语言:js复制
const ary = array.reduce((result, current) => {
    const isExsist = result.some(item => item.name === current.name);
    return isExsist ? result : [...result, current];
}, []);

四、利用ES6的新增数据类型Set去重

代码语言:js复制
const ary = [...new Set(array)];
// OR
const ary2 = Array.from(new Set(array))

充分利用Set的不重复特性来达到去重的目的

直到最近,我收到了某公众号推送的一条消息,标题叫“一个让面试官对你产生好感的数组去重方法”,点进去之后,确实有让我耳目一新的感觉,废话不多说,先看代码

代码语言:js复制
const ary = array.filter((item, index, originArray) => {
  return originArray.indexOf(item) === index;
});

看懂了代码后,第一感觉是,在我没全面使用es6之前,我怎么就不知道还有这个方法来去重。

这个方法充分利用了数组的indexOf方法的特点,那就是它永远只会返回第一个被查找元素的索引,那么,在filter方法中,非第一个的就会被过滤掉,真的不得不服有些人的举一反三的能力,有了这个方法,就算不适用es6的filter方法,也可以只遍历一次原数组就可以去重了

代码语言:js复制
const result = [];
array.forEach((item, index) => {
  if(array.indexOf(item) === index) {
      result.push(item)
  }
});

0 人点赞