我是JavaScript新手,正在阅读有关高阶函数,如map,filter和reduce。 为了实际操作,我尝试了以下示例: 假设购物车中有一些商品,使用reduce来计算商品的总成本。
var products = [{
"id": 100,
"name": "Dell laptop",
"category": "Laptop",
"price": 40000
}, {
"id": 100,
"name": "LG Mobile",
"category": "Mobile",
"price": 20000
}, {
"id": 100,
"name": "HP laptop",
"category": "Laptop",
"price": 60000
}, {
"id": 100,
"name": "Samsung Mobile",
"category": "Mobile",
"price": 25000
}];
var total = 0;
var result = products.reduce(function (total, product) {
return total + parseInt(product.price);
});
console.log("Total cost of cart : " + result);
以上代码的输出如下:
Total cost of cart : [object Object]200006000025000
现在我修改了上面的代码并添加了地图以及它们正常工作:
var result = products.map(function (product) {
return product.price;
}).reduce(function (total, price) {
return total + price;
});
我得到了正确的结果。
现在我的问题是为什么我无法单独使用reduce API?
答案 0 :(得分:2)
是的,你可以。不需要两次reduce
次呼叫。只需将初始值0
作为最后一个参数传递给reduce
。
var total = products.reduce(function(prev, curr) {
return prev + curr.price;
}, 0);
// ^^ Initial value
var products = [{
"id": 100,
"name": "Dell laptop",
"category": "Laptop",
"price": 40000
}, {
"id": 100,
"name": "LG Mobile",
"category": "Mobile",
"price": 20000
}, {
"id": 100,
"name": "HP laptop",
"category": "Laptop",
"price": 60000
}, {
"id": 100,
"name": "Samsung Mobile",
"category": "Mobile",
"price": 25000
}];
var total = products.reduce(function(prev, curr) {
return prev + curr.price;
}, 0);
document.body.innerHTML = total;

答案 1 :(得分:1)
您需要阅读the documentation:
arr.reduce(callback[, initialValue])
...
第一次调用回调时,
previousValue
和currentValue
可以是两个值之一。如果initialValue
调用中提供reduce
,则previousValue
将等于initialValue
,currentValue
将等于数组中的第一个值。 如果未提供initialValue
,则previousValue
将等于数组中的第一个值,currentValue
将等于第二个值。
由于您没有提供初始值,因此您的第一个操作实际上是{id: ...} + 20000
。您需要提供initialValue
0
来解决此问题。