删除javascript数组中重复对象的所有实例[重复]

Posted

技术标签:

【中文标题】删除javascript数组中重复对象的所有实例[重复]【英文标题】:Remove all instances of duplicate objects in a javascript array [duplicate] 【发布时间】:2021-11-03 02:23:50 【问题描述】:

我正在尝试删除 javascript 数组中所有重复对象的实例。下面的辅助函数适用于删除重复项并保留 1 个实例,但我想通过删除所有实例来基本上取消与另一个对象具有相同属性的任何对象的资格。

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
  
]

将不胜感激任何想法!

【问题讨论】:

如果两个values 相同怎么办?它只是name 键吗?您可以使用代码here 但反转条件并将id 更改为name 以匹配您的密钥,即values.filter(e => !lookup[e.name]) 【参考方案1】:

假设你的意图是以这种方式调用上面的函数: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));
    );

基本上,对于数据数组中的每个元素,如果有另一个元素具有相同的“键”,我会检查剩余的值。我使用"some" method for Javascript arrays 进行测试。过滤器函数只返回未通过此测试的值。


正如一些人所指出的 - 这不是最有效的解决方案,所以让我提供一个更好的实现:

function removeDuplicatesBetter(data, key) 
    return data.filter((o, idx) => 
        return !data.some((o2, idx2) => idx !== idx2 && key(o) === key(o2));
    );


这是一个演示解决方案的 Repl.it:https://replit.com/@VehpuS/removeDuplicates

【讨论】:

这是解决此问题的一种非常复杂的方法,因为无论如何您都要对其进行两次过滤,并在每次迭代中创建一个对象列表。 (我没有投反对票) 虽然我同意,至少对于所提供的输入大小而言,性能不是问题:)。但足够公平 - 我将添加一个更有效的实现 第二种解决方案效果很好,谢谢!【参考方案2】:

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  ]

【讨论】:

以上是关于删除javascript数组中重复对象的所有实例[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript 从数组中删除所有重复项 [重复]

jQuery / Javascript从对象数组中删除一个对象[重复]

javascript 从javascript中的对象数组中删除重复项

如何从 javascript 变量中删除对象/数组?

jQuery / Javascript从对象数组中删除对象[重复]

JavaScript ES6 - 计算对象数组的重复项