减少不返回,但分配给变量失败

时间:2017-08-21 07:21:20

标签: javascript ecmascript-6

使用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/

我不确定accumobj2.male_count确实返回了什么错误。

4 个答案:

答案 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)