我正在编写一个简单的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
我做错了什么?
答案 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
}
直播示例:
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;
你可以编写你的回调,以便检测它是否作为第一个参数或累加器传递了一个条目,但它不必要地使代码复杂化。
答案 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;
});
}