JS -Array .Reduce返回NAN而不是计算值



我正在写一个简单的减少功能:

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区域:" 12055600804" Tilearea:" 12055600804" CurrentPick区域:" 24111201608 ...

但是我在JSBIN中获得的控制台输出是:

" tilearea:" 12055600804" CurrentPick区域:" 12055600804" Tilearea:" 未定义的" CurrentPick区域:" 11609327018 NAN

我在做什么错?

jsbin参考

请记住,第一个参数传递给您的回调是累加器,您的回调应该返回该累加器的更新版本,然后在下一个呼叫上使用。因此,tile仅是 first 调用的数组中的条目;之后,这将是您的回调返回。

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

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

实时示例:

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));

you 可以写下您的回调,以便检测到该条目是作为第一个参数还是累加器,但它不必要地使代码复杂化。

我在做什么错?

您没有检查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;
  });
}

最新更新