我有一个非常棘手的数据结构,我需要迭代才能生成更简洁的对象。
在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,每个等...)没有快乐,也许我没有使用正确的方法。非常感谢任何帮助。
答案 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;
答案 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;
}, {}));