JavaScript的reduce函数给出不正确的值

3
考虑数据为例。
{
    "Groceries": [
        {
            "category": {
                "uri": "/categories/20fe3330-80e1-4908-9f57-5b7ef575b197",
                "parent": "Food & Drink",
                "name": "Groceries"
            },
            "amount": "85.14",
            "debit": true
        },
        {
            "category": {
                "uri": "/categories/20fe3330-80e1-4908-9f57-5b7ef575b197",
                "parent": "Food & Drink",
                "name": "Groceries"
            },
            "amount": "19.15",
            "debit": true
        },
        {
            "category": {
                "uri": "/categories/20fe3330-80e1-4908-9f57-5b7ef575b197",
                "parent": "Food & Drink",
                "name": "Groceries"
            },
            "amount": "4.2",
            "debit": true
        },
        {
            "category": {
                "uri": "/categories/20fe3330-80e1-4908-9f57-5b7ef575b197",
                "parent": "Food & Drink",
                "name": "Groceries"
            },
            "amount": "16.08",
            "debit": true
        },
        {
            "category": {
                "uri": "/categories/20fe3330-80e1-4908-9f57-5b7ef575b197",
                "parent": "Food & Drink",
                "name": "Groceries"
            },
            "amount": "28.48",
            "debit": true
        },
        {
            "category": {
                "uri": "/categories/20fe3330-80e1-4908-9f57-5b7ef575b197",
                "parent": "Food & Drink",
                "name": "Groceries"
            },
            "amount": "35.82",
            "debit": true
        },
        {
            "category": {
                "uri": "/categories/20fe3330-80e1-4908-9f57-5b7ef575b197",
                "parent": "Food & Drink",
                "name": "Groceries"
            },
            "amount": "12.15",
            "debit": true
        },
        {
            "category": {
                "uri": "/categories/20fe3330-80e1-4908-9f57-5b7ef575b197",
                "parent": "Food & Drink",
                "name": "Groceries"
            },
            "amount": "4.19",
            "debit": true
        },
        {
            "category": {
                "uri": "/categories/20fe3330-80e1-4908-9f57-5b7ef575b197",
                "parent": "Food & Drink",
                "name": "Groceries"
            },
            "amount": "34.11",
            "debit": true
        },
        {
            "category": {
                "uri": "/categories/20fe3330-80e1-4908-9f57-5b7ef575b197",
                "parent": "Food & Drink",
                "name": "Groceries"
            },
            "amount": "3.36",
            "debit": true
        },
        {
            "category": {
                "uri": "/categories/20fe3330-80e1-4908-9f57-5b7ef575b197",
                "parent": "Food & Drink",
                "name": "Groceries"
            },
            "amount": "11.32",
            "debit": true
        }
    ],
    "Restaurants": [
        {
            "category": {
                "uri": "/categories/15147702-8227-4ee8-8b05-d2e8d532bd0a",
                "parent": "Food & Drink",
                "name": "Restaurants"
            },
            "amount": "18.43",
            "debit": true
        }
    ]
} 

我希望这些数据与下面的内容类似:

所有我想要的是,这些数据要像以下内容一样:

{
    "Groceries": 1234.12, # (1234.12 is madeup value for now)added values for all Groceries transaction
    "Restaurents": 18.42
}

我正在使用Lodash来完成这个任务,我的代码如下所示:

var mapped = _.reduce(data, function(result, num, key){
  var sum = 0.0;
  sum = _.reduce(num, function(sum, n){
      console.log(key + ':' + parseFloat(n.amount));
      return sum + parseFloat(n.amount);
  });
  result[key] = sum;
  return result;
}, {})

我得到的结果是

"{
    "Groceries": "[object Object]19.154.216.0828.4835.8212.154.1934.113.3611.32",
    "Restaurants": {
        "category": {
            "uri": "/categories/15147702-8227-4ee8-8b05-d2e8d532bd0a",
            "parent": "Food & Drink",
            "name": "Restaurants"
        },
        "amount": "18.43",
        "debit": true
    }
}"

我在这里做错了什么?
2个回答

4
文档中得知:
减少一个集合到一个值,这个值是通过将集合中的每个元素运行通过回调函数之后所累积的结果,其中每个连续的回调函数执行都消耗前一个执行的返回值。如果没有传递累加器,集合的第一个元素将被用作初始累加器值。
因此,您应该提供一个初始值或解析sum,因为它是一个String对象,我建议提供一个初始值,因为除了第一次之外每次解析都没有意义。
所以你可以这样做:
var s = _.reduce(num, function(sum, n){
  return sum + parseFloat(n.amount);
}, 0);

0
var restaurants = {
    "Restaurants": [
        {
            "category": {
                "name": "Restaurants"
            },
            "amount": "88.91"
        },
        {
            "category": {
                "name": "Restaurants"
            },
            "amount": "58.14"
        }]};

var groceries = {
    "Groceries": [
        {
            "category": {
                "name": "Groceries"
            },
            "amount": "58.41"
        },
        {
            "category": {
                "name": "Groceries"
            },
            "amount": "85.14"
        }]};

function reduce_category(collection) {
    return _.reduce(collection, function (memo, entry) { 
        return memo += parseFloat(entry.amount, 10);
    }, 0);
}

console.log((function reduce_collection(collection) {
    var sum = _.reduce(collection, function (memo, entry) {
        return memo += reduce_category(entry[_.first(_.keys(entry))]);
    }, 0);

    return (Math.round(sum * 100) / 100).toFixed(2);
}([restaurants, groceries]))) // => 290.60

小提琴。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接