js数组去重的多种实践

107 阅读1分钟

一、简单数组去重

1.set()方法

// 使用 Set 和展开运算符
const nums = [1, 2, 2, 3, 3, 4];
const newNums1 = [...new Set(nums)];
// 使用 Set 和Array.from()
const nums = [1, 2, 2, 3, 3, 4];
const newNums = Array.from(new Set(nums));
console.log(newNums); // [1, 2, 3, 4]

2.filter + indexOf方法

const nums = [1, 2, 2, 3, 3, 4];
const newNums = nums.filter((n, i) => {
    return nums.indexOf(n) === i;
});
console.log(newNums); // [1, 2, 3, 4]

3.reduce + includes方法

// 使用 reduce 的正确方式
const nums = [1, 2, 2, 3, 3, 4];
const newNums2 = nums.reduce((acc, curr) => {
    return acc.includes(curr) ? acc : [...acc, curr];
}, []);

4.Map数据类型

// 使用 Map
const nums = [1, 2, 2, 3, 3, 4];
const newNums3 = [...new Map(nums.map(n => [n, n])).values()];

5.Object.values方法

const nums = [1, 2, 2, 3, 3, 4];
const newNums4 = Object.values(
    nums.reduce((acc, curr) => ({...acc, [curr]: curr}), {})
);

二、对象数组去重

const data = [
    { id: 1, name: 'Alice' },
    { id: 2, name: 'Bob' },
    { id: 3, name: 'Alice' },
];

1.Map方法

const result = Array.from(new Map(data.map(ele => [ele.name, ele])).values())

2.if判断方法

const result = []
const obj = {}
data.map(ele => {
    if (!obj[ele.name]) {
        result.push(ele)
        obj[ele.name] = true
    }
})

return result

3.filter + Set方法

const set = new Set()
const result = data.filter((item, index) => {
    const value = item[name]
    if (!set.has(value)) {
        set.add(value)
        return true
    }
    return false
})