返回

数组去重,来点独特的回顾

前端

数组去重:超越常规的维度

在浩瀚的编程世界中,数组去重是一项基本且至关重要的任务。从海量数据中过滤出独一无二的元素,宛如剥丝抽茧,抽丝剥茧。然而,当我们探索 JavaScript 中的数组去重时,通常会陷入固有的思维模式,只关注 indexOf、Set、Array.from 等常规技巧。但如果我们打破惯性思维,跳出固有思维的藩篱,就会发现数组去重隐藏着更多令人着迷的可能性。

利用对象属性去重

对象在 JavaScript 中有着至高无上的地位,其属性不可重复,这为我们提供了一种巧妙的去重方式。我们可以创建一个对象,将数组元素作为对象的属性,这样,只有不重复的元素会被保留。

const arr = [1, 2, 3, 1, 2, 3];
const unique = {};
arr.forEach(el => unique[el] = true);
console.log(Object.keys(unique)); // [1, 2, 3]

去重并统计数组中每个元素出现的次数

除了去重,我们有时还希望了解每个元素出现的次数。通过结合对象和 Set,我们可以轻松实现这一目标。

const arr = [1, 2, 3, 1, 2, 3];
const unique = new Set(arr);
const count = {};
unique.forEach(el => count[el] = (count[el] || 0) + 1);
console.log(count); // {1: 2, 2: 2, 3: 2}

一 indexOf

indexOf 函数通常用于搜索元素在数组中的位置,但它也可以巧妙地用于去重。我们可以利用其从左到右查找元素的特性,过滤出第一个出现的位置,剔除后续重复的元素。

const arr = [1, 2, 3, 1, 2, 3];
const unique = [];
arr.forEach(el => {
    if (arr.indexOf(el) === arr.lastIndexOf(el)) {
        unique.push(el);
    }
});
console.log(unique); // [1, 2, 3]

二 [...new Set(arr)]

Set 数据结构以其不可重复的特性著称,这使其成为去重的天然选择。通过展开一个 Set 的实例,我们可以轻松获取独一无二的元素。

const arr = [1, 2, 3, 1, 2, 3];
const unique = [...new Set(arr)];
console.log(unique); // [1, 2, 3]

Array.from与 Set 去重

Array.from 函数可以从可迭代对象(如 Set)创建一个新数组。结合 Set 的去重能力,我们可以优雅地过滤出独一无二的元素。

const arr = [1, 2, 3, 1, 2, 3];
const unique = Array.from(new Set(arr));
console.log(unique); // [1, 2, 3]

结语

数组去重不仅仅是一项技术任务,更是一门艺术。通过超越常规的边界,我们挖掘出了其鲜为人知的维度,展现了其无限的可能性。无论你是寻求简洁的解决方案,还是渴望创新性,这篇文章都为你提供了灵感和启发。下次当你需要去重时,不妨跳出固有思维,拥抱独到的视角,让你的代码脱颖而出。

常见问题解答

  1. 有哪些其他去重算法?
    除了本文提到的方法,还有其他去重算法,如排序去重、双指针去重等。

  2. 如何处理嵌套数组或对象?
    对于嵌套数组或对象,可以先将其展开成一维数组或对象,再进行去重。

  3. 如何去重并保留元素的顺序?
    可以使用 Set 数据结构,它保证元素的顺序与插入顺序一致。

  4. 如何使用 Lodash 或 Underscore 等库去重?
    Lodash 和 Underscore 等库提供了便捷的去重方法,如 _.uniq() 和 _.unique()。

  5. 如何去重字符串数组中的空白字符串?
    可以先用 trim() 方法去除字符串中的空白,再进行去重。