【问题标题】: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)

      【讨论】:

        猜你喜欢
        • 2012-05-17
        • 2020-06-29
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-28
        相关资源
        最近更新 更多