说我想对a.x中的每个元素求和arr。
a.x
arr
arr = [{x:1},{x:2},{x:4}] arr.reduce(function(a,b){return a.x + b.x}) >> NaN
我有理由相信,斧头在某些时候是不确定的。
以下工作正常
arr = [1,2,4] arr.reduce(function(a,b){return a + b}) >> 7
我在第一个示例中做错了什么?
第一次迭代后,您将返回一个数字,然后尝试获取该数字的属性x以将其添加到下一个对象中,该对象是undefined和数学,其中涉及undefined结果NaN。
x
undefined
NaN
尝试返回一个对象x,该对象包含一个属性,该属性与参数的x个属性之和:
var arr = [{x:1},{x:2},{x:4}]; arr.reduce(function (a, b) { return {x: a.x + b.x}; // returns object with property x }) // ES6 arr.reduce((a, b) => ({x: a.x + b.x})); // -> {x: 7}
从注释中添加了说明:
每次迭代的返回值在下一次迭代中[].reduce用作a变量。
[].reduce
a
迭代1: ,,a = {x:1} 分配给在迭代2b = {x:2}``{x: 3}``a
a = {x:1}
b = {x:2}``{x: 3}``a
迭代2:a = {x:3},b = {x:4}。
a = {x:3}
b = {x:4}
您的示例的问题在于您要返回数字文字。
function (a, b) { return a.x + b.x; // returns number literal }
迭代1: ,,a = {x:1} 如在下次迭代b = {x:2}``// returns 3``a
b = {x:2}``// returns 3``a
迭代2: a = 3,b = {x:2}回报NaN
a = 3
b = {x:2}
许多文字3不(通常)有一个叫做财产x所以它undefined和 undefined + b.x回报NaN,并NaN + <anything>始终NaN
3
undefined + b.x
NaN + <anything>
澄清 :我更喜欢我的方法,而不是该线程中的其他最高答案,因为我不同意这样的想法,即传递一个可选参数以使用幻数来减少以得出数字基元会更干净。这可能导致写入的行数减少,但imo可读性却下降。