如何对对象数组中的公共密钥求和?

时间:2015-08-28 16:28:59

标签: javascript object lodash

我有一个非常棘手的数据结构,我需要迭代才能生成更简洁的对象。

lodash(或javascript,如果更好),有没有办法通过采用所有original.day类型并将其original.value添加到一起,然后合并到其给定集合中来生成唯一键值创建一个新对象;

这是我的原始对象,有些项目显示为重复项,但仍应将这些值一起添加到相应的日期。

var original = [

  { day: 01, value: 0 },
  { day: 01, value: 2 },

  { day: 02, value: 4 },
  { day: 02, value: 1 },

  { day: 03, value: 3 },
  { day: 03, value: 9 },

  { day: 01, value: 0 },
  { day: 01, value: 4 },

  { day: 02, value: 2 },
  { day: 02, value: 0 },

  { day: 03, value: 3 },
  { day: 03, value: 3 }

];

然后我需要得到以下内容:

var output = [
  { day01: 6 },
  { day02: 7 },
  { day03: 18 }
];

或:

var output = [
  [01,6],
  [02,7],
  [03,18]
];

我已经尝试了很多不同的方法与lodash(uniq,reduce,每个等...)没有快乐,也许我没有使用正确的方法。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

你可以在普通的Javascript中这样做。创建day01样式键只需要几行代码。您可以在此处运行此代码段以查看结果:



function sumDays(list) {
    var result = {};
    list.forEach(function(item) {
        var dayNum = item.day;
        var dayPrefix = dayNum <= 9 ? "0" : "";
        var key = "day" + dayPrefix + dayNum;
        if (!result[key]) {
            result[key] = 0;
        }
        result[key] += item.value;
    });
    return result;
}

var original = [

  { day: 01, value: 0 },
  { day: 01, value: 2 },

  { day: 02, value: 4 },
  { day: 02, value: 1 },

  { day: 03, value: 3 },
  { day: 03, value: 9 },

  { day: 01, value: 0 },
  { day: 01, value: 4 },

  { day: 02, value: 2 },
  { day: 02, value: 0 },

  { day: 03, value: 3 },
  { day: 03, value: 3 }

];

var r = sumDays(original);
document.write(JSON.stringify(r));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

解决此问题的最快方法是使用 _.reduce 表示lodash或 Array.prototype.reduce() 表示普通javascript。

<强> Lodash

<强> DEMO

function getTotalDays(collection) {
  return _.reduce(collection, function(result, item) {
    var index = 'day' + _.padLeft(item.day, 2, 0);
    result[index] = (result[index] || 0) + item.value;
    return result;
  }, {});
}

PLAIN JAVASCRIPT

<强> DEMO

function getTotalDays(collection) {
  return collection.reduce(function(result, item) {
    var index = 'day' + (item.day < 10? '0': '') + item.day;
    result[index] = (result[index] || 0) + item.value;
    return result;
  }, {});
}

答案 2 :(得分:0)

这将为您提供第二种格式[["01",6], ["02",7], ["03",18]]

_.pairs(_.reduce(original, function(output, item) {
    var day = '0' + item.day;
    output[day] = (output[day] || 0) + item.value;
    return output;
}, {}));