使用对象传播运算符(ES6,JavaScript)添加多个对象

Nar*_*n S 5 javascript object ecmascript-6 spread-syntax

我有3个具有相同数据的对象,但内部数组具有单独的服务和提供ID,因此我尝试获得如下所述的预期结果, 请在此处检查我的尝试。提前致谢

对象1:

const obj1 = {
              bid              : 1,
              mobile           : 9533703390,
              services : [
                  {
                   service_id  : 5,
                   offer_id    : 10,
                   count       : 1
                  }
              ]
        }
Run Code Online (Sandbox Code Playgroud)

对象2:

const obj2 = {
              bid              : 1,
              mobile           : 9524703390,
              services : [
                  {
                   service_id  : 8,
                   offer_id    : 12,
                   count       : 1
                  }
              ]
        }
Run Code Online (Sandbox Code Playgroud)

对象3:

const obj3 = {
              bid              : 1,
              mobile           : 9524703390,
              services : [
                  {
                   service_id  : 5,
                   offer_id    : 10,
                   count       : 1
                  }
              ]
        }
Run Code Online (Sandbox Code Playgroud)

最终结果-每个对象具有单独的服务和要约,然后,如果要约的要约和服务要约相同,则需要加计数+ 1,否则返回数据

  const result = {

                 bid              : 1,
                 mobile           : 9524703390,
                 services : [
                    {
                      service_id  : 5,
                      offer_id    : 10,
                      count       : 2
                    },
                    {
                      service_id  : 8,
                      offer_id    : 12,
                      count       : 1
                    }
                 ]

              }
Run Code Online (Sandbox Code Playgroud)

Has*_*mam 4

您可以使用array#reduce将所有对象合并为单个对象和array#concatservices。然后使用array#reduce将所有基于的服务对象合并service_id到一个对象中,并将该对象的值重新分配给services

const obj1 = { bid : 1, mobile : 9533703390, services : [ { service_id : 5, offer_id : 10, count : 1 } ] },
      obj2 = { bid : 1, mobile : 9524703390, services : [ { service_id : 8, offer_id : 12, count : 1 } ] },
      obj3 = { bid : 1, mobile : 9524703390, services : [ { service_id : 5, offer_id : 12, count : 1 } ] };

var combined = [obj1, obj2, obj3].reduce((r,o) => Object.assign({}, o, {services : r.services.concat(o.services)}));

combined.services = Object.values(combined.services.reduce((res, services) => {
  if(res[services.service_id])
    res[services.service_id].count += services.count;
  else
    res[services.service_id] = Object.assign({}, services);
    return res;
},{}));

console.log(combined)
Run Code Online (Sandbox Code Playgroud)