js - array .reduce返回NaN而不是计算值

时间:2017-11-28 12:01:15

标签: javascript ecmascript-6

我正在编写一个简单的reduce函数:

var tiles = [
  {
    "date": "2017-11-26",
    "cloudCoverage": 92.2,
    "area": 12055600804
  },
  {
    "date": "2017-11-26",
    "cloudCoverage": 92.78,
    "area": 12055600804
  },
  {
    "date": "2017-11-26",
    "cloudCoverage": 97.29,
    "area": 11609327018
  }
]

function selectDateTile(tiles) {
  return tiles.reduce((tile, currentPick) => {
    console.log('tileArea: ', tile.area, 'currentPick area: ', currentPick.area)
    return tile.area + currentPick.area
  });
}

console.log(selectDateTile(tiles))

我希望它能记录对象的实际值,以及所有区域的总和:

  

“tileArea:”12055600804“currentPick area:”12055600804“tileArea:”   12055600804“currentPick area:”24111201608 ...

但是我在jsbin中得到的控制台输出是:

  

“tileArea:”12055600804“currentPick area:”12055600804“tileArea:”   undefined“currentPick area:”11609327018 NaN

我做错了什么?

jsbin reference

2 个答案:

答案 0 :(得分:5)

请记住,传递给回调的第一个参数是累加器,并且您的回调应该返回该累加器的更新版本,然后在下次调用时使用。所以tile只是第一次调用中数组的一个条目;在那之后,它将是你的回调返回的任何东西。

如果您希望总结area属性,您希望为累加器提供初始值(第二个参数为reduce),然后将其用作值,不是一个对象:

function selectDateTile(tiles) {
  return tiles.reduce((sum, currentPick) => { // <== Note `sum` parameter
    return sum + currentPick.area;            // <== Using `sum`
  }, 0);                                      // <== 0 as initial value
}

直播示例:

&#13;
&#13;
var tiles = [
  {
    "date": "2017-11-26",
    "cloudCoverage": 92.2,
    "area": 12055600804
  },
  {
    "date": "2017-11-26",
    "cloudCoverage": 92.78,
    "area": 12055600804
  },
  {
    "date": "2017-11-26",
    "cloudCoverage": 97.29,
    "area": 11609327018
  }
];

function selectDateTile(tiles) {
  return tiles.reduce((sum, currentPick) => { // <== Note `sum` parameter
    return sum + currentPick.area;            // <== Using `sum`
  }, 0);                                      // <== 0 as initial value
}

console.log(selectDateTile(tiles));
&#13;
&#13;
&#13;

可以编写你的回调,以便检测它是否作为第一个参数或累加器传递了一个条目,但它不必要地使代码复杂化。

答案 1 :(得分:1)

  

我做错了什么?

您没有检查tile是否具有area属性,因为它是累加器,并且在第一次迭代后它将只是数字

function selectDateTile(tiles) {
  return tiles.reduce((tile, currentPick) => {
    console.log('tileArea: ', tile.area, 'currentPick area: ', currentPick.area)
    return tile.area ? tile.area + currentPick.area : tile + currentPick.area;
  });
}