使用对象扩展运算符添加多个对象(ES6,JavaScript)
Adding multiple objects using object spread operator (ES6, JavaScript)
我有 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,否则 return 数据
const result = {
bid : 1,
mobile : 9524703390,
services : [
{
service_id : 5,
offer_id : 10,
count : 2
},
{
service_id : 8,
offer_id : 12,
count : 1
}
]
}
展开运算符不进行递归追加或类似的操作。但是,您可以像这样将它与 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);
检查更新后的 fiddle http://jsfiddle.net/rkdejpab/15/
您可以使用 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)
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));
我有 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,否则 return 数据
const result = {
bid : 1,
mobile : 9524703390,
services : [
{
service_id : 5,
offer_id : 10,
count : 2
},
{
service_id : 8,
offer_id : 12,
count : 1
}
]
}
展开运算符不进行递归追加或类似的操作。但是,您可以像这样将它与 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);
检查更新后的 fiddle http://jsfiddle.net/rkdejpab/15/
您可以使用 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)
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));