使用reduce是可以在不返回值的情况下对所有值求和,但是将其赋值给外部变量?我使用下面的代码得到NAN的错误。
const raw = [{
"age_data": [{
"male_count": 13,
"female_count": 13
}, {
"male_count": 452,
"female_count": 470
}]
}, {
"age_data": [{
"male_count": 1,
"female_count": 2
}, {
"male_count": 58,
"female_count": 32
}]
}]
let total_male_count, total_female_count = 0
raw.forEach(obj => {
obj.age_data.reduce((accum, obj2) => {
total_male_count = accum + obj2.male_count
total_female_count = accum + obj2.female_count
}, 0)
})
console.log(total_male_count)
console.log(total_female_count)
https://jsfiddle.net/L6ttsL8t/
我不确定accum
,obj2.male_count
确实返回了什么错误。
答案 0 :(得分:0)
如果您没有使用其返回值,则不要使用reduce
。对于您正在做的事情,只需使用forEach
。
您的total_male_count
未初始化,因此它开始包含undefined
(您只是初始化了total_female_count
)。此外,您只想添加total_...
变量,而不是使用累加器。
因此,初始化它,添加到现有变量,并使用正确的“循环”函数,您将获得正确的值。
let total_male_count = 0, total_female_count = 0
// -----------------^^^^
raw.forEach(obj => {
obj.age_data.forEach(obj2 => {
// ------------^^^^^^^^^^^^
total_male_count += obj2.male_count
// ------------------^^
total_female_count += obj2.female_count
// --------------------^^
}, 0)
})
直播示例:
const raw = [{
"age_data": [{
"male_count": 13,
"female_count": 13
}, {
"male_count": 452,
"female_count": 470
}]
}, {
"age_data": [{
"male_count": 1,
"female_count": 2
}, {
"male_count": 58,
"female_count": 32
}]
}]
let total_male_count = 0, total_female_count = 0
raw.forEach(obj => {
obj.age_data.forEach(obj2 => {
total_male_count += obj2.male_count
total_female_count += obj2.female_count
}, 0)
})
console.log(total_male_count)
console.log(total_female_count)
答案 1 :(得分:0)
试试这个
var total_male_count= 0;
var total_female_count = 0;
for(var i of raw){
for(var j of i.age_data){
total_male_count += j.male_count;
total_female_count += j.female_count;
}
}
console.log(total_male_count);
console.log(total_female_count);
答案 2 :(得分:0)
以下是使用两个array#reduce
的解决方案,内部减少总和每个age_data
的男性和女性数量,而外部减少总和为age_data
const raw = [{"age_data": [{"male_count": 13,"female_count": 13}, {"male_count": 452,"female_count": 470}]
}, {"age_data": [{"male_count": 1,"female_count": 2}, {"male_count": 58,"female_count": 32}]}]
var output = raw.reduce ((sum, obj) => {
let temp = obj.age_data.reduce((accum, obj2) => {
accum.total_male_count += obj2.male_count;
accum.total_female_count += obj2.female_count;
return accum;
}, {total_male_count : 0, total_female_count: 0});
sum.total_male_count += temp.total_male_count;
sum.total_female_count += temp.total_female_count;
return sum;
},{total_male_count : 0, total_female_count: 0})
console.log(output)

你不需要减少,这可以通过两个forEach
完成。另外,您需要初始化total_male_count = 0
const raw = [{
"age_data": [{
"male_count": 13,
"female_count": 13
}, {
"male_count": 452,
"female_count": 470
}]
}, {
"age_data": [{
"male_count": 1,
"female_count": 2
}, {
"male_count": 58,
"female_count": 32
}]
}]
let total_male_count = 0, total_female_count = 0
raw.forEach(obj => {
obj.age_data.forEach((obj2) => {
total_male_count += obj2.male_count;
total_female_count += obj2.female_count;
})
})
console.log(total_male_count)
console.log(total_female_count)

答案 3 :(得分:-1)
我编辑了您的代码以使其正常工作,尽管这不是正确的方法
const raw = [{
"age_data": [{
"male_count": 13,
"female_count": 13
}, {
"male_count": 452,
"female_count": 470
}]
}, {
"age_data": [{
"male_count": 1,
"female_count": 2
}, {
"male_count": 58,
"female_count": 32
}]
}]
let total_male_count= 0, total_female_count = 0
raw.forEach(obj => {
obj.age_data.reduce((accum, obj2) => {
total_male_count += obj2.male_count;
total_female_count += obj2.female_count;
}, 0)
})
console.log(total_male_count)
console.log(total_female_count)

正确的方法是
const raw = [{
"age_data": [{
"male_count": 13,
"female_count": 13
}, {
"male_count": 452,
"female_count": 470
}]
}, {
"age_data": [{
"male_count": 1,
"female_count": 2
}, {
"male_count": 58,
"female_count": 32
}]
}]
let total_male_count= 0, total_female_count = 0
raw.forEach(function(element){
let obj = element.age_data.reduce((accum, obj2) => {
return {"male_count": accum.male_count + obj2.male_count,
"female_count": accum.female_count + obj2.female_count};
}, {"male_count": 0,
"female_count": 0});
total_male_count += obj.male_count;
total_female_count += obj.female_count;
})
console.log(total_male_count)
console.log(total_female_count)