返回

数组去重技巧大揭秘:一招制敌,面试官也能反手“调戏”

前端

数组去重:揭开其神秘面纱

数组去重,顾名思义,就是从一个数组中移除重复的元素,只保留独一无二的值。乍看之下,这似乎是一项简单的任务,但深入探究,你会发现它大有乾坤,有多种巧妙的方法可以实现这一目标。

方法一:Set,天然的去重器

Set是一种内置数据结构,专门用于存储唯一的值,并且它具有自动去重的特性。因此,我们可以轻而易举地利用它来实现数组去重:

const arr = [1, 2, 3, 1, 2, 3, 4, 5, 5, 6];

// 将数组转换成Set
const set = new Set(arr);

// 将Set转换成数组
const uniqueArray = [...set];

console.log(uniqueArray); // [1, 2, 3, 4, 5, 6]

这种方法简单易行,但需要注意的是,Set本身并不是数组,如果你需要对去重后的结果进行进一步的操作,则需要将其转换回数组。

方法二:Array.filter(),逐个筛选

Array.filter()方法可以根据指定的条件对数组中的元素进行过滤,我们巧妙地利用这一点来实现数组去重:

const arr = [1, 2, 3, 1, 2, 3, 4, 5, 5, 6];

// 使用Array.filter()进行去重
const uniqueArray = arr.filter((item, index, arr) => {
  return arr.indexOf(item) === index;
});

console.log(uniqueArray); // [1, 2, 3, 4, 5, 6]

这种方法的原理是,Array.filter()方法会遍历数组中的每个元素,并根据我们提供的回调函数(箭头函数)进行判断,只有当元素第一次出现时才会被保留。

方法三:Array.map(),巧妙转换

Array.map()方法可以对数组中的每个元素进行转换,我们灵活运用这一点来实现数组去重:

const arr = [1, 2, 3, 1, 2, 3, 4, 5, 5, 6];

// 使用Array.map()进行去重
const uniqueArray = arr.map((item, index, arr) => {
  return {
    value: item,
    index: index
  };
});

// 将转换后的数组按照index属性进行排序
uniqueArray.sort((a, b) => {
  return a.index - b.index;
});

// 去除重复的元素
const result = [];
for (let i = 0; i < uniqueArray.length; i++) {
  if (i === 0 || uniqueArray[i].value !== uniqueArray[i - 1].value) {
    result.push(uniqueArray[i].value);
  }
}

console.log(result); // [1, 2, 3, 4, 5, 6]

这种方法的精髓在于,我们首先将数组中的每个元素转换为一个包含值和索引的对象,然后对这些对象按照索引排序,这样重复元素就会相邻。最后,我们遍历排序后的数组,只保留第一个出现的元素。

方法四:lodash.uniq(),强大助手

lodash是一个流行的JavaScript库,提供了各种实用工具,其中就包括uniq()方法,专门用于数组去重。它的用法简洁明了:

const arr = [1, 2, 3, 1, 2, 3, 4, 5, 5, 6];

// 使用lodash.uniq()进行去重
const uniqueArray = _.uniq(arr);

console.log(uniqueArray); // [1, 2, 3, 4, 5, 6]

lodash.uniq()方法的原理与Array.filter()方法类似,它也遍历数组中的每个元素,并返回不重复的元素。

总结

数组去重在JavaScript中是一个常见问题,有多种方法可以解决。在本文中,我们介绍了四种最常用的方法:Set、Array.filter()、Array.map()和lodash.uniq()。每种方法都有其独到的优势和适用场景,大家可以根据自己的实际情况选择最合适的方法。

常见问题解答

  1. Set和Array.filter()哪个方法更快?
    这取决于数组的大小和重复元素的分布。总体来说,Set方法更适合处理大数组和大量重复元素的情况。

  2. Array.map()方法和Array.filter()方法有什么区别?
    Array.filter()方法返回一个新的数组,只包含符合条件的元素。Array.map()方法返回一个新的数组,其中每个元素都是原数组中相应元素的转换结果。

  3. 什么时候应该使用lodash.uniq()方法?
    当你想使用lodash库的丰富功能时,lodash.uniq()方法是一个很好的选择。它提供了额外的功能,例如处理排序数组和自定义比较函数。

  4. 如何处理对象数组的去重?
    对于对象数组,你需要根据对象的特定属性进行去重。你可以使用Array.filter()方法或Array.reduce()方法来实现这一点。

  5. 数组去重还有什么其他方法?
    除了本文提到的方法之外,还有一些其他方法可以实现数组去重,例如使用哈希表、二叉树或位掩码。