Javascript reduce提供的值不正确

时间:2013-08-03 23:21:26

标签: javascript lodash

考虑数据

{
    "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 个答案:

答案 0 :(得分:4)

来自docs

  

将集合减少为一个值,该值是通过回调运行集合中每个元素的累积结果,其中每个连续的回调执行都会消耗先前执行的返回值。如果未传递累加器,则集合的第一个元素将用作初始累加器值

所以你要么提供一个初始值,要么解析sum,因为它是一个String对象,我建议给出一个初始值,因为每次过去解析它都没有意义。第一

所以你可以这样做:

var s = _.reduce(num, function(sum, n){
  return sum + parseFloat(n.amount);
}, 0);

答案 1 :(得分: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

Fiddle.