【问题标题】:Find (and remove) duplicates in array of objects depending on object attributes根据对象属性在对象数组中查找(并删除)重复项
【发布时间】:2017-04-28 20:47:44
【问题描述】:
我想根据对象属性删除对象数组中的重复项。
简化示例:
假设你有一个像这样的数组:
[
{
name: 'alice',
something: 123
},
{
name: 'alice',
something: 321
},
{
name: 'bob',
something: 213
}
]
我想删除对象,它们与 name 具有相同的值,但 我想通过一些自定义计算来决定要删除的对象(例如,为 @987654324 保留具有更大值的对象@)。
我能够调整 find duplicate values in a JavaScript array 中接受的答案,但是对于超过 2 个重复项,这效果不佳。
【问题讨论】:
标签:
javascript
arrays
object
【解决方案1】:
您可以尝试使用 reduce 和 object,根据您的条件设置属性。
然后通过 Object.values 将其转换为数组。
var arr = [
{
name: 'alice',
something: 123
},
{
name: 'alice',
something: 321
},
{
name: 'bob',
something: 213
}
];
var res = arr.reduce( (acc,b) => {
if ((acc[b.name] && acc[b.name].something < b.something) || !acc[b.name]) {
acc[b.name] = b;
}
return acc;
}, {});
var newArr = Object.values(res);
console.log(newArr);
【解决方案2】:
您可以使用哈希表作为对同名对象的引用。
var array = [{ name: 'alice',something: 123 }, { name: 'alice', something: 321 }, { name: 'bob', something: 213 }],
result = array.reduce(function (hash) {
return function (r, a) {
if (!(a.name in hash)) {
hash[a.name] = r.push(a) - 1;
return r;
}
if (r[hash[a.name]].something < a.something) {
r[hash[a.name]] = a;
}
return r;
};
}(Object.create(null)), []);
console.log(result)