一尘不染

Javascript减少对象数组

node.js

说我想对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

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


阅读 317

收藏
2020-07-07

共1个答案

一尘不染

第一次迭代后,您将返回一个数字,然后尝试获取该数字的属性x以将其添加到下一个对象中,该对象是undefined和数学,其中涉及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变量。

迭代1: ,,a = {x:1} 分配给在迭代2b = {x:2}``{x: 3}``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回报NaN,并NaN + <anything>始终NaN

澄清
:我更喜欢我的方法,而不是该线程中的其他最高答案,因为我不同意这样的想法,即传递一个可选参数以使用幻数来减少以得出数字基元会更干净。这可能导致写入的行数减少,但imo可读性却下降。

2020-07-07