在JavaScript中,数组去重是一个常见的需求,尤其在处理数据时,重复的元素可能会导致错误或不一致的结果。这里我们将介绍14种不同的方法来实现数组去重,并通过代码示例来演示每种方法的实现。

1. 使用 Set

Set 是一种新的数据结构,能够存储唯一值。通过将数组转换为 Set,然后再将其转换回数组,可以轻松实现去重。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = Array.from(new Set(array));
console.log(uniqueArray); // [1, 2, 3, 4, 5]

2. 利用 filterindexOf

使用 filter 方法遍历数组,并结合 indexOf 方法来判断数组中第一次出现的元素的下标是否等于当前下标。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.filter((item, index) => array.indexOf(item) === index);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

3. 使用 reduce

可以使用 reduce 方法来构建一个新的数组,该数组将只包含唯一值。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.reduce((accumulator, current) => {
    if (!accumulator.includes(current)) {
        accumulator.push(current);
    }
    return accumulator;
}, []);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

4. 使用 forEach

使用 forEach 遍历数组,并将唯一值添加到新的数组中。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [];
array.forEach(item => {
    if (!uniqueArray.includes(item)) {
        uniqueArray.push(item);
    }
});
console.log(uniqueArray); // [1, 2, 3, 4, 5]

5. 使用 mapfilter

通过 map 创建一个新的数组,再结合 filter 可以实现去重。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.map((item, index) => ({
    item,
    index
})).filter((current, index, self) => 
   index === self.findIndex(t => t.item === current.item)
).map(o => o.item);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

6. 使用 includesfor 循环

通过 for 循环和 includes 方法,可以手动检查每个元素是否已经存在于新的数组中。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [];
for (let i = 0; i < array.length; i++) {
    if (!uniqueArray.includes(array[i])) {
        uniqueArray.push(array[i]);
    }
}
console.log(uniqueArray); // [1, 2, 3, 4, 5]

7. 利用 Object 的属性来去重

可以使用对象的属性来存储已经见过的元素,从而去重。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueObject = {};
const uniqueArray = [];
for (let i = 0; i < array.length; i++) {
    if (!uniqueObject[array[i]]) {
        uniqueArray.push(array[i]);
        uniqueObject[array[i]] = true;
    }
}
console.log(uniqueArray); // [1, 2, 3, 4, 5]

8. 使用 sort 和遍历

通过对数组进行排序,再遍历一遍,直接比较相邻的元素来实现去重。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.sort().filter((item, index) => item !== array[index - 1]);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

9. 使用 JSON 方法

将数组转换为 JSON 字符串是另一种去重的方法,然后再解析回来。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = JSON.parse(JSON.stringify([...new Set(array)]));
console.log(uniqueArray); // [1, 2, 3, 4, 5]

10. 利用递归(仅适合小数组的场景)

可以使用递归函数进行去重,不过不建议用于大数组。

const uniqueRecursive = (arr, result = []) => {
    if (arr.length === 0) return result;
    const [first, ...rest] = arr;
    if (!result.includes(first)) result.push(first);
    return uniqueRecursive(rest, result);
};

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = uniqueRecursive(array);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

11. 使用 Array.prototype.some

利用 some 方法判断元素是否已经存在来实现去重。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [];
array.forEach(item => {
    if (!uniqueArray.some(uniqueItem => uniqueItem === item)) {
        uniqueArray.push(item);
    }
});
console.log(uniqueArray); // [1, 2, 3, 4, 5]

12. 使用 Array.from + map + filter

另一种利用 Array.from 结合 mapfilter 的方法。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = Array.from(array.map((item, index) => ({
    item,
    index
})))
.filter((current, index, self) => 
   index === self.findIndex(t => t.item === current.item)
).map(o => o.item);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

13. 使用 spliceindexOf

利用 splice 方法在原数组中进行操作。

const array = [1, 2, 2, 3, 4, 4, 5];
for (let i = 0; i < array.length; i++) {
    while (array.indexOf(array[i], i + 1) !== -1) {
        array.splice(array.indexOf(array[i], i + 1), 1);
    }
}
console.log(array); // [1, 2, 3, 4, 5]

14. 使用第三方库

如果你的项目中使用了 Lodash 或类似的库,可以直接使用它们提供的去重方法。

const _ = require('lodash');
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = _.uniq(array);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

以上就是在 JavaScript 中实现数组去重的 14 种方法。根据不同的应用场景和需求,开发者可以选择适合自己的去重方式。希望本篇文章对你有帮助!

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部