简体   繁体   English

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

[英]Adding multiple objects using object spread operator (ES6, JavaScript)

i have 3 objects having same data but inside array having separate service and offer id so i tried to get expected result as below mentioned and please check my try here . 我有3个具有相同数据的对象,但内部数组具有单独的服务和提供ID,因此我尝试获得如下所述的预期结果, 请在此处检查我的尝试 Thanks in advance 提前致谢

Object 1: 对象1:

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

object2 : 对象2:

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

object 3: 对象3:

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

Final Result - each object having separate services and offer then if same offerid & serviceid came need to add count + 1 otherwise return data 最终结果-每个对象具有单独的服务和要约,然后,如果要约的要约和服务要约相同,则需要加计数+ 1,否则返回数据

  const result = {

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

              }

You can use array#reduce to merge all objects into single object and array#concat the services values. 您可以使用array#reduce将所有对象合并为单个对象,并使用array#concat services值。 Then use array#reduce to merge all service object based on service_id in an object and reassign the values of this object to 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) 

The spread operator doesn't do recursive appending or anything like that. Spread运算符不进行递归追加或类似的操作。 You can however use it in conjunction with Object.assign like so: 但是,您可以将其与Object.assign结合使用,如下所示:

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

Then you can consolidate the services: 然后,您可以合并服务:

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;

If you still want the services to be an array then you can do 如果您仍然希望服务成为数组,则可以执行

result.services = Object.entries(servicesObject)
                      .map(([key,value]) => value);

Check the updated fiddle http://jsfiddle.net/rkdejpab/15/ 检查更新的小提琴http://jsfiddle.net/rkdejpab/15/

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));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM