我试图删除javascript数组中重复对象的所有实例。下面的辅助函数在删除重复项和保留一个实例方面工作得很好,但是我想通过删除所有实例来取消任何具有与另一个对象相等属性的对象。
function removeDuplicates(data, key) {
return [
... new Map(
data.map(x => [key(x), x])
).values()
]
}
未清理数组的示例:
[
{
name: 'name1',
value: 15
},
{
name: 'name2',
value: 16
},
{
name: 'name3',
value: 17
},
{
name: 'name1',
value: 18
}
]
从上面的辅助函数返回:
[
{
name: 'name1',
value: 15
},
{
name: 'name2',
value: 16
},
{
name: 'name3',
value: 17
}
]
我想要返回的内容:
[
{
name: 'name2',
value: 16
},
{
name: 'name3',
value: 17
}
]
非常感谢!
假设您打算以这种方式调用上面的函数:removeDuplicates(data, (x) => x.name)
,这是我的实现
function removeDuplicates(data, key) {
return data.filter((o, idx) => {
const remainingData = [...data.slice(0, idx), ...data.slice(idx + 1)];
return !remainingData.some(o2 => key(o) === key(o2));
});
}
基本上,对于数据数组中的每个元素,我检查剩余的值,如果有另一个元素具有相同的"键"。我用的是"某某"方法来测试这一点。筛选函数只返回未通过此测试的值。
正如一些人注意到的,这不是最有效的解决方案,所以让我提供一个更好的实现:
function removeDuplicatesBetter(data, key) {
return data.filter((o, idx) => {
return !data.some((o2, idx2) => idx !== idx2 && key(o) === key(o2));
});
}
这是一个Repl。它演示了解决方案:https://replit.com/@VehpuS/removeduplicate
function removeDuplicates(arr, key) {
const duplicates = arr.reduce((seen, obj) => ((seen[obj[key]] = seen.hasOwnProperty(obj[key])), seen), {});
return arr.filter((obj) => !duplicates[obj[key]]);
}
//Usage:
const input = [
{
name: "name1",
value: 15,
},
{
name: "name2",
value: 16,
},
{
name: "name3",
value: 17,
},
{
name: "name1",
value: 18,
},
];
const output = removeDuplicates(input, "name");
console.log(output);
//output: [ { name: 'name2', value: 16 }, { name: 'name3', value: 17 } ]