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

5
我可以帮您翻译成中文。这段内容与IT技术有关,提到了一个数组中有三个数据相同的对象,但每个对象内部都有不同的服务和优惠ID。该段文字以HTML格式呈现,其中包含一个链接,请点击此处查看我尝试过的方法。感谢您的提前帮助。
第一个对象:
const obj1 = {
              bid              : 1,
              mobile           : 9533703390,
              services : [
                  {
                   service_id  : 5,
                   offer_id    : 10,
                   count       : 1
                  }
              ]
        }

对象2:

const obj2 = {
              bid              : 1,
              mobile           : 9524703390,
              services : [
                  {
                   service_id  : 8,
                   offer_id    : 12,
                   count       : 1
                  }
              ]
        }

对象3:

const obj3 = {
              bid              : 1,
              mobile           : 9524703390,
              services : [
                  {
                   service_id  : 5,
                   offer_id    : 10,
                   count       : 1
                  }
              ]
        }

最终结果 - 每个对象都有单独的服务和优惠,如果出现相同的优惠ID和服务ID,则需要将计数器加1,否则返回数据。

  const result = {

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

              }

1
展开运算符并不是魔法。它无法决定如何合并或何时需要递归。您需要手动迭代服务以正确合并它们。 - apokryfos
请您能否提供一些示例。我是 JavaScript 的新手,因为我正在寻找一个好的解决方案。 - Narayanan S
请检查我的答案。它是一个解决方案,但不确定是否符合“好的解决方案”的标准。 - apokryfos
3个回答

4
您可以使用array#reduce将所有对象合并为单个对象,并使用array#concat连接services值。然后使用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)


嗨,如何根据service_id和offer_id合并所有服务对象? - Narayanan S
你可以在“combined”对象中使用组合键。一个可能的键可以是“services.service_id + '|' + services.offer_id”。 - Hassan Imam

1

展开运算符不会进行递归追加或类似的操作。但是,您可以与Object.assign结合使用,如下所示:

const result = Object.assign(
 obj1, 
 obj2, 
 obj3, { 
  services: [ ...obj1.services, ...obj2.services, ...obj3.services,  ]
}); //Consolidate everything

然后,您可以 consol idate(巩固)服务:
const servicesObject = {};
result.services.forEach((service) => {
        if (servicesObject[service.service_id] !== undefined) {
            servicesObject[service.service_id].count += 1;
    } else {
          servicesObject[service.service_id] = service;
    }
}); // Merge services
result.services = servicesObject;

如果您仍希望服务成为一个数组,则可以执行以下操作
result.services = Object.entries(servicesObject)
                      .map(([key,value]) => value);

请查看更新的演示 http://jsfiddle.net/rkdejpab/15/


1
function merge(...objs) {

    let result = objs.reduce((acc, item) => {
        acc.bid = item.bid;
        acc.mobile = item.mobile;
        if (!acc.services) {
            acc.services = []
            acc.services.push(item.services[0]);
        }
        else {
            let index = acc.services.findIndex(function (elem) {
                return elem.service_id === item.services[0].service_id && elem.offer_id == item.services[0].offer_id;
            });
            if (!(index === -1)) {
                acc.services[index].count += 1;
            }
            else {
                acc.services.push(item.services[0]);
            }
        }
            return acc
    }, {});
    return result;
}

console.log(merge(obj1, obj2, obj3));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接