根据对象属性

时间:2017-04-28 12:12:47

标签: javascript arrays object

我想删除对象数组中的重复项,具体取决于对象属性。

简化示例: 假设您有一个类似的数组:

[
 { 
   name: 'alice',
   something: 123
 },
 {
   name: 'alice',
   something: 321
 },
 {
  name: 'bob',
  something: 213
 }
]

我想删除name具有相同值的对象,但是我想通过一些自定义计算确定要删除的对象(例如,保持对象具有更大的值something)。

我能够在 find duplicate values in a JavaScript array中调整已接受的答案,但是对于超过2个重复项,这种方法效果不佳。

2 个答案:

答案 0 :(得分: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);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用哈希表作为对相同名称对象的引用。

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)