【发布时间】:2016-06-21 09:49:07
【问题描述】:
我有一个按不同类别分组的数组,每个类别都嵌套了更多具有不同值(数字和字符串)的对象,我必须减少这些对象(字符串除外)。 Reduce 可以很好地处理对它们求和的数值,但它会覆盖字符串值,只保留最后一个。
我正在尝试按类别减少对象/字典,并用每个类别的单位总和填充表格,但如果子类别和名称不同,则不要将它们相加。
这是一个演示:
var data = {
'Category xxxx': [
{
units: 1234,
subcategory: 'wolves',
name: 'Starks'
},
{
units: 1345354,
subcategory: 'wolves',
name: 'Starks'
},
{
units: 666,
subcategory: 'dragons',
name: 'Targaryens'
}
],
'Category yyyy': [
{
units: 7783,
subcategory: 'lions',
name: 'Lanisters'
},
{
units: 1267878,
subcategory: 'spires',
name: 'Martells'
}
]
}
var test = _.map(data, function (value, key) {
var returnedData = {
Category: key,
units: _(value).reduce(function (memo, metrics) {
return memo + metrics.units;
}, 0),
subcategory: _(value).reduce(function (memo, metrics) {
return metrics.subcategory;
}, 0),
name: _(value).reduce(function (memo, metrics) {
return metrics.name;
}, 0),
};
return returnedData;
});
console.log(test)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
单位(整数)加起来很好,但字符串被最后一次迭代的字符串属性覆盖。
我想获得这样的东西,如果字符串不同,则整数不会相加。
returnedData = {
'Category xxxx': [
{
units: 1346588,
chivalry: 'wolves',
name: 'Starks'
},
{
units: 666,
subcategory: 'dragons',
name: 'Targaryens'
}
],
'Category yyyy': [
{
clicks: 7783,
subcategory: 'lions',
name: 'Lanisters'
},
{
clicks: 1267878,
subcategory: 'spires',
name: 'Martells'
}
]
}
最好的方法是什么?
【问题讨论】:
-
看起来很简单
$.each -
@Justinas:没有jquery 标签,即使有,
$.each也是 so 2008 年。:-)Array#forEach或者可能是Array#reduce适用。 -
@phileras 你能提供一个预期结果的例子以及你尝试了什么吗?
-
是的@Justinas 我正在尝试使用reduce,在这种情况下下划线reduce,但如果可能的话我会使用javascript array.reduce。
-
嗨 @T.J.Crowder 我想要类似于 Nina 答案的结果,我在这里展示的数组是一个演示,在这种情况下数据非常大,我将不得不做更多的子组,但想法和结果尼娜被挪用了。之后我需要检查性能,但这是一个乞求。谢谢:)
标签: javascript arrays json