我有一个看起来像这样的数组:
const values = [
{
value: 2000,
items: [
{
value: 300,
},
],
},
]
我想对values.value
中所有值的总和求和,如果存在values.items.value
,我也想将其包括在求和中。
values.reduce((total, obj) => obj.value + total, 0);
什么是键入嵌套数组的正确方法,以便它对我的reduce函数中的顶部和嵌套value
键进行求和?我想要的输出是2300
,但是现在我只能深入一层,并且输出2000
。
答案 0 :(得分:3)
您可以使用reduce add value并检查items
是否存在,然后再添加items数组的值
const values = [{value: 2000,items: [{value: 300,},],},]
let op = values.reduce((op,{value,items}) => {
op+= value
if(items && items.length) {
items.forEach(({value})=> op+=value )
}
return op
},0)
console.log(op)
答案 1 :(得分:3)
您可以嵌套reduce
方法来处理内部数组,同时确保键存在于内部数组对象中。
const values = [
{
value: 2000,
items: [
{
value: 300,
},
],
},
];
const total = values.reduce((acc, obj) => {
acc += obj.value;
acc += obj.items.reduce((a, o) => 'value' in o ? o.value + a : a, 0);
return acc;
}, 0);
console.log(total);
// 2300
答案 2 :(得分:1)
您可以迭代对象的键/值并求和嵌套对象的总和,然后将所需的键或零作为起始值。
function sum(object, key) {
return Object.entries(object).reduce((s, [k, v]) => {
if (v && typeof v === 'object') return s + sum(v, key);
return s;
}, key in object ? object[key] : 0);
}
const values = [{ value: 2000, items: [{ value: 300 }] }];
console.log(sum(values, 'value'));
答案 3 :(得分:0)
我将添加一个内部reduce()
以获取items
数组的累加和。另外,为了安全起见,我将使用isNaN()
和Array.isArray()
添加一些检查:
const values = [
{value: 2000, items: [{value: 300}]},
{value: 3000},
{value: 2000, items: [{value: 300}, {foo: 20}]},
{nothing: "nothing"}
];
let res = values.reduce((acc, {value, items}) =>
{
acc += isNaN(value) ? 0 : value;
acc += Array.isArray(items) ?
items.reduce((sum, {value}) => sum + (isNaN(value) ? 0 : value), 0) :
0;
return acc;
}, 0);
console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}