如何在 Javascript 中为每个子组嵌套数组对象求和某些属性的值?



从下面的对象中,我想按照它们的密钥组(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);

最新更新