【问题标题】:Adding multiple objects using object spread operator (ES6, JavaScript)使用对象扩展运算符(ES6、JavaScript)添加多个对象
【发布时间】:2018-05-13 00:41:41
【问题描述】:

我有 3 个对象具有相同的数据,但在数组内部具有单独的服务和提供 id,所以我试图得到预期的结果,如下所述和 please check my try here。提前致谢

对象 1:

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 需要添加计数 + 1 否则返回数据

  const result = {

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

              }

【问题讨论】:

  • 展开运算符并不神奇。它无法决定如何合并或何时需要递归。您需要对服务进行手动迭代才能正确合并它们。
  • 你能提供一些例子吗?我是 java 脚本的新手,因为我正在尝试好的解决方案
  • 检查我的答案。这是一个解决方案,但不确定它是否符合“好解决方案”的条件

标签: javascript object ecmascript-6 spread-syntax


【解决方案1】:

您可以使用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 合并所有服务对象?
  • 您可以在combined 对象中使用组合键。一个可能的密钥是services.service_id + '|' + services.offer_id
【解决方案2】:

扩展运算符不执行递归附加或类似的操作。但是,您可以将它与 Object.assign 一起使用,如下所示:

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

然后您可以整合服务:

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/

【讨论】:

    【解决方案3】:
    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));
    

    【讨论】:

      猜你喜欢
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 2019-09-29
      • 2017-06-12
      • 2020-06-09
      • 2020-05-08
      • 2021-04-09
      相关资源
      最近更新 更多