我们可以使用参数对象集合而不是原始数据来调用JavaScript collection.reduce()方法吗?

时间:2016-05-13 04:27:47

标签: javascript

我是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?

2 个答案:

答案 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])

     

...

     

第一次调用回调时,previousValuecurrentValue可以是两个值之一。如果initialValue调用中提供reduce,则previousValue将等于initialValuecurrentValue将等于数组中的第一个值。 如果未提供initialValue,则previousValue将等于数组中的第一个值,currentValue将等于第二个值。

由于您没有提供初始值,因此您的第一个操作实际上是{id: ...} + 20000。您需要提供initialValue 0来解决此问题。