从下面的对象中,我想按照它们的密钥组(1345、2353(来总结某些属性(fare+tax和com+agency(,并在当前数组对象中更新它。
var details = [{ 1345:[
{route: 34, fare: 45, tax: 46, date: 46, com: 45, agency: 24, totalCost: 0, totalFee: 0}],
2353: [
{route: 32, fare: 45, tax: 45, date: 56, com: 34, agency: 52, totalCost: 0, totalFee: 0},
{route: 42, fare: 34, tax: 64, date: 34, com: 56, agency: 34, totalCost: 0, totalFee: 0}
]}
]
预期输出:更新的details
(totalCost和totalFee(
1345:
{ route: 34, fare: 45, .... totalCost: 91, totalFee: 69 }
2353:
{ route: 32, fare: 45, ... totalCost: 188, totalFee: 90 },
{ route: 42, fare: 34, ... totalCost: 188, totalFee: 176 }
CCD_ 2和CCD_ 3
我试图简化数组对象,并使用Object.entries(details[0](进行转换,然后减少以总结目标属性。
Object.entries(details[0]).reduce((acc, curr) => (acc = acc + curr["fare"]+curr["tax"]), 0);
然而,NaN被退回。
如果有人能告诉我如何循环浏览每个关键组,总结目标值并更新它(totalCost和totalFee(,我将不胜感激。
一种(多种(方法是使用一个简单的求和函数来求和任意值数组:
function sum(...nums) {
return nums.reduce((acc, val) => acc + val)
}
接下来,对每个密钥组(1345和2353(的totalCost
/totalFee
逻辑求和,然后将这些和应用于每个数组条目:
for (const [key, vals] of Object.entries(details[0])) {
vals.forEach((val, _, vals) => {
val.totalFee = sum(...vals.map(val => val.com + val.agency))
val.totalCost = sum(...vals.map(val => val.fare + val.tax))
})
}
以下是整个事件:
const details = [
{
1345: [
{route: 34, fare: 45, tax: 46, date: 46, com: 45, agency: 24, totalCost: 0, totalFee: 0},
],
2353: [
{route: 32, fare: 45, tax: 45, date: 56, com: 34, agency: 52, totalCost: 0, totalFee: 0},
{route: 42, fare: 34, tax: 64, date: 34, com: 56, agency: 34, totalCost: 0, totalFee: 0},
],
},
]
for (const [key, vals] of Object.entries(details[0])) {
vals.forEach((val, _, vals) => {
val.totalFee = sum(...vals.map(val => val.com + val.agency))
val.totalCost = sum(...vals.map(val => val.fare + val.tax))
})
}
console.log(JSON.stringify(details, null, 2))
function sum(...nums) {
return nums.reduce((acc, val) => acc + val)
}
我们可以使用几个Array.reduce()
调用来实现这一点,最终结果应该是所需的。
对于每个密钥组,我们将使用Object.entries()
来获得该组的密钥和值。
const details = [{ 1345:[ {route: 34, fare: 45, tax: 46, date: 46, com: 45, agency: 24, totalCost: 0, totalFee: 0}], 2353: [ {route: 32, fare: 45, tax: 45, date: 56, com: 34, agency: 52, totalCost: 0, totalFee: 0}, {route: 42, fare: 34, tax: 64, date: 34, com: 56, agency: 34, totalCost: 0, totalFee: 0} ]} ]
const result = details.reduce((acc, group) => {
return Object.entries(group).reduce((acc, [key, routes] ) => {
return routes.reduce((acc, { fare, tax, com, agency}) => {
acc[key] = acc[key] || {};
acc[key].totalCost = (acc[key].totalCost || 0) + fare + tax;
acc[key].totalFee = (acc[key].totalFee || 0) + com + agency;
return acc;
}, acc)
}, acc)
}, {})
console.log('Result:', result)
.as-console-wrapper { max-height: 100% !important; }
我在这里更新了,在每个密钥组下都包含了原始数组,并将其命名为"路由",这可以更改为任何内容:
const details = [{ 1345:[ {route: 34, fare: 45, tax: 46, date: 46, com: 45, agency: 24, totalCost: 0, totalFee: 0}], 2353: [ {route: 32, fare: 45, tax: 45, date: 56, com: 34, agency: 52, totalCost: 0, totalFee: 0}, {route: 42, fare: 34, tax: 64, date: 34, com: 56, agency: 34, totalCost: 0, totalFee: 0} ]} ]
const result = details.reduce((acc, group) => {
return Object.entries(group).reduce((acc, [key, routes] ) => {
return routes.reduce((acc, { fare, tax, com, agency}) => {
acc[key] = acc[key] || { routes };
acc[key].totalCost = (acc[key].totalCost || 0) + fare + tax;
acc[key].totalFee = (acc[key].totalFee || 0) + com + agency;
return acc;
}, acc)
}, acc)
}, {})
console.log('Result:', result)
.as-console-wrapper { max-height: 100% !important; }
扩展Object.values
的使用
var details = [{ 1345:[
{route: 34, fare: 45, tax: 46, date: 46, com: 45, agency: 24, totalCost: 0, totalFee: 0}],
2353: [
{route: 32, fare: 45, tax: 45, date: 56, com: 34, agency: 52, totalCost: 0, totalFee: 0},
{route: 42, fare: 34, tax: 64, date: 34, com: 56, agency: 34, totalCost: 0, totalFee: 0}
]}
]
Object.values(details).map(x => {
details = {}
let count = 0;
for (let y of Object.values(x)) {
y = y.reduce(function (a, b) {
for (const key in b) {
if (a[key]) {
a[key] = a[key] + b[key]
} else {
a[key] = b[key];
}
}
return a;
}, {});
y['totalCost'] = y['fare'] + y['tax'];
y['totalFee'] = y['com'] + y['agency'];
let totalObj = {};
totalObj['totalCost:'] = y['totalCost'];
totalObj['totalFee:'] = y['totalFee'];
details[`${Object.keys(x)[count]}`] = totalObj;
count++;
};
});
console.log(details);