【问题标题】:Unique array of objects and merge duplications using lodash or underscore使用 lodash 或下划线的唯一对象数组和合并重复项
【发布时间】:2017-05-09 19:04:26
【问题描述】:

我有一个可以包含重复项的对象数组,但我想通过一个属性来唯一化数组,然后我想有条件地合并重复项的属性。例如,给下面的数组

var array = [
   {
     name: 'object1',
     propertyA: true,
     propertyB: false,
     propertyC: false 
   },
   {
     name: 'object2',
     propertyA: false,
     propertyB: true,
     propertyC: false
   },
   {
     name: 'object1',
     propertyA: false,
     propertyB: true,
     propertyC: false
   }
]

知道每个对象都有 name、propertyA、propertyB 和 propertyC,我想通过 name 属性来唯一化,并保留 propertyA、propertyB 和 propertyC 的真实值。于是上面的数组就变成了,

var updatedArray = [
   {
     name: 'object1',
     propertyA: true,
     propertyB: true,
     propertyC: false 
   },
   {
     name: 'object2',
     propertyA: false,
     propertyB: true,
     propertyC: false
   }
]

使用 lodash/underscore 的最佳方法是什么?

【问题讨论】:

    标签: javascript arrays underscore.js lodash


    【解决方案1】:

    您可以使用_.uniqWith 来做到这一点,但它需要您在返回它们是否相等的布尔值之前改变其中一个参数,所以我不推荐它。

    更好的选择是使用_.groupBy 后跟_.map 来对唯一名称进行分组,然后自定义组合它们的方式。在您的情况下,您可以使用 _.assignWith 组合同名对象,然后将逻辑或 || 操作作为组合函数。

    使用 ES6,它几乎变成了一条线:

    var array = [{"name":"object1","propertyA":true,"propertyB":false,"propertyC":false},{"name":"object2","propertyA":false,"propertyB":true,"propertyC":false},{"name":"object1","propertyA":false,"propertyB":true,"propertyC":false}];
        
    var updatedArray =
      _(array)
        .groupBy('name')
        .map(objs => _.assignWith({}, ...objs, (val1, val2) => val1 || val2))
        .value();
        
    console.log(updatedArray);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

    【讨论】:

    【解决方案2】:

    使用纯 Javascript,您可以使用哈希表作为对具有相同名称的唯一对象的引用,并通过键在循环中收集值并使用逻辑 OR 进行更新。

    var array = [{ name: 'object1', propertyA: true, propertyB: false, propertyC: false }, { name: 'object2', propertyA: false, propertyB: true, propertyC: false }, { name: 'object1', propertyA: false, propertyB: true, propertyC: false }],
        unique = array.reduce(function (hash) {
            return function (r, a) {
                if (!hash[a.name]) {
                    hash[a.name] = { name: a.name };
                    r.push(hash[a.name]);
                }
                Object.keys(a).forEach(function (k) {
                    if (k !== 'name') {
                        hash[a.name][k] = hash[a.name][k] || a[k];
                    }
                });
                return r;
            };
        }(Object.create(null)), []);
    
    console.log(unique);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2021-01-06
      • 1970-01-01
      • 2015-05-05
      • 2015-05-13
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 2018-09-14
      相关资源
      最近更新 更多