假设我想对arr中的每个元素求和a.x.

arr = [ { x: 1 }, { x: 2 }, { x: 4 } ];
arr.reduce(function(a, b){ return a.x + b.x; }); // => NaN

我有理由相信,在某个时刻,a.x等于undefined.

以下方法很好

arr = [ 1, 2, 4 ];
arr.reduce(function(a, b){ return a + b; }); // => 7

在第一个示例中,我做错了什么?

推荐答案

在第一次迭代之后,你将返回一个数字,然后try 将其属性x添加到下一个对象,即undefined,涉及undefined的数学结果为NaN.

try 返回一个包含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}

从 comments 中添加的解释:

在下一次迭代中用作a变量的每个迭代的返回值[].reduce.

迭代1:a = {x:1}b = {x:2}{x: 3}在迭代2中分配给a

迭代2: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

迭代2:a = 3b = {x:2}返回NaN

数字文字3(通常)没有名为x的属性,因此它是undefinedundefined + b.x返回NaNNaN + <anything>始终是NaN

Clarification:我更喜欢我的方法,而不是这个线程中的另一个顶级答案,因为我不同意这样的观点,即传递一个可选参数来用一个魔术数字来减少,以获得一个数字基元更干净.它可能会导致写入的行数较少,但可读性较差.

Javascript相关问答推荐

获取最接近的父项(即自定义元素)

JavaScript:循环访问不断变化的数组中的元素

foreach循环中的Typescript字符串索引

如何在使用fast-xml-parser构建ML时包括属性值?

微软Edge Select 间隙鼠标退出问题

为什么!逗号和空格不会作为输出返回,如果它在参数上?

我的服务工作器没有连接到我的Chrome扩展中的内容脚本.我该怎么解决这个问题?

不能将空字符串传递给cy.containes()

try 使用javascript隐藏下拉 Select

使用VUE和SCSS的数字滚动动画(&;内容生成)

Webpack在导入前混淆文件名

将Node.js包发布到GitHub包-错误ENEEDAUTH

元素字符串长度html

在SHINY R中的嵌套模块中,不能使用Java代码

无法读取未定义的属性(正在读取合并)-react RTK

JavaScript将字符串数字转换为整数

JAVASCRIPT SWITCH CASE语句:当表达式为';ALL';

MongoDB通过数字或字符串过滤列表

计算对象数组中属性的滚动增量

脚本语法错误只是一个字符串,而不是一个对象?