Javascript 使用下划线或Lodash将行数组减少为汇总行
我有一个如下所示的行数组:Javascript 使用下划线或Lodash将行数组减少为汇总行,javascript,underscore.js,lodash,Javascript,Underscore.js,Lodash,我有一个如下所示的行数组: [ { metric1: 50, metric2: 60 }, { metric1: 100, metric2: 120; } ] { metric1: 150, metric2: 180 } 我想把它简化成一行,如下所示: [ { metric1: 50, metric2: 60 }, { metric1: 100, metric2: 120; } ]
[
{
metric1: 50,
metric2: 60
},
{
metric1: 100,
metric2: 120;
}
]
{
metric1: 150,
metric2: 180
}
我想把它简化成一行,如下所示:
[
{
metric1: 50,
metric2: 60
},
{
metric1: 100,
metric2: 120;
}
]
{
metric1: 150,
metric2: 180
}
到目前为止,我有一个相当直接的方法:
_.reduce(function(row, aggregate) {
_.each(row, function(value, metric) {
aggregate[metric] = aggregate[metric] || 0;
aggregate[metric] += value;
});
return aggregate;
}, {});
但我真的觉得用下划线或Lodash函数编程可以更简洁地实现这一点。有什么想法吗?你可以用香草javascript干净利落地完成:
var result = data.reduce(function(totals, v) {
totals.metric1 += v.metric1;
totals.metric2 += v.metric2;
return totals;
}, {metric1: 0, metric2: 0});
编辑:如果度量名称直到运行时才知道,那么您的解决方案可以正常工作。下面是另一个使用的解决方案。merge
:
var result = _.merge.apply(null, [{}].concat(data).concat(function(total, v) {
return (total || 0) + v;
}));
或者,如果您正在使用ES6:
var result = _.merge({}, ...data, (total=0, v) => {
return total + v;
});
您可以使用香草javascript干净地完成此操作:
var result = data.reduce(function(totals, v) {
totals.metric1 += v.metric1;
totals.metric2 += v.metric2;
return totals;
}, {metric1: 0, metric2: 0});
编辑:如果度量名称直到运行时才知道,那么您的解决方案可以正常工作。下面是另一个使用的解决方案。merge
:
var result = _.merge.apply(null, [{}].concat(data).concat(function(total, v) {
return (total || 0) + v;
}));
或者,如果您正在使用ES6:
var result = _.merge({}, ...data, (total=0, v) => {
return total + v;
});
您可以使用香草javascript干净地完成此操作:
var result = data.reduce(function(totals, v) {
totals.metric1 += v.metric1;
totals.metric2 += v.metric2;
return totals;
}, {metric1: 0, metric2: 0});
编辑:如果度量名称直到运行时才知道,那么您的解决方案可以正常工作。下面是另一个使用的解决方案。merge
:
var result = _.merge.apply(null, [{}].concat(data).concat(function(total, v) {
return (total || 0) + v;
}));
或者,如果您正在使用ES6:
var result = _.merge({}, ...data, (total=0, v) => {
return total + v;
});
您可以使用香草javascript干净地完成此操作:
var result = data.reduce(function(totals, v) {
totals.metric1 += v.metric1;
totals.metric2 += v.metric2;
return totals;
}, {metric1: 0, metric2: 0});
编辑:如果度量名称直到运行时才知道,那么您的解决方案可以正常工作。下面是另一个使用的解决方案。merge
:
var result = _.merge.apply(null, [{}].concat(data).concat(function(total, v) {
return (total || 0) + v;
}));
或者,如果您正在使用ES6:
var result = _.merge({}, ...data, (total=0, v) => {
return total + v;
});
我确信
metric1
是未知的statically@zerkms我不太确定,但我想那是杰克林让我们知道的。我已经用另一种解决方案更新了我的答案。“我对此不太确定”-只要检查他们的代码。@zerkms代码没有说明密钥是否静态已知。他可能只是试图简化添加额外指标的过程。代码明确表示密钥未知。如果它们是已知的,并且确实如此,那么代码就不会有嵌套循环。我确信metric1
是未知的statically@zerkms我不太确定,但我想那是杰克林让我们知道的。我已经用另一种解决方案更新了我的答案。“我对此不太确定”-只要检查他们的代码。@zerkms代码没有说明密钥是否静态已知。他可能只是试图简化添加额外指标的过程。代码明确表示密钥未知。如果它们是已知的,并且确实如此,那么代码就不会有嵌套循环。我确信metric1
是未知的statically@zerkms我不太确定,但我想那是杰克林让我们知道的。我已经用另一种解决方案更新了我的答案。“我对此不太确定”-只要检查他们的代码。@zerkms代码没有说明密钥是否静态已知。他可能只是试图简化添加额外指标的过程。代码明确表示密钥未知。如果它们是已知的,并且确实如此,那么代码就不会有嵌套循环。我确信metric1
是未知的statically@zerkms我不太确定,但我想那是杰克林让我们知道的。我已经用另一种解决方案更新了我的答案。“我对此不太确定”-只要检查他们的代码。@zerkms代码没有说明密钥是否静态已知。他可能只是试图简化添加额外指标的过程。代码明确表示密钥未知。如果它们是已知的,并且是这样的话,那么代码就不会有嵌套的循环。在我看来,你所得到的看起来非常干净,只是为了好玩现代ES:丑陋的想法你的数据是对象数组的格式。这是mxn的一个例子。您的解决方案可以修改为{.reduce(函数(行,聚合){.each(行,函数(值,度量){aggregate[metric]+=aggregate[metric]?value | | 0;});return aggregate;},{});在我看来,你所拥有的东西看起来相当干净,只是为了好玩:丑陋的想法你的数据是以对象数组的形式存在的。这是mxn的一个例子。您的解决方案可以修改为{.reduce(函数(行,聚合){.each(行,函数(值,度量){aggregate[metric]+=aggregate[metric]?value | | 0;});return aggregate;},{});在我看来,你所拥有的东西看起来相当干净,只是为了好玩:丑陋的想法你的数据是以对象数组的形式存在的。这是mxn的一个例子。您的解决方案可以修改为{.reduce(函数(行,聚合){.each(行,函数(值,度量){aggregate[metric]+=aggregate[metric]?value | | 0;});return aggregate;},{});在我看来,你所拥有的东西看起来相当干净,只是为了好玩:丑陋的想法你的数据是以对象数组的形式存在的。这是mxn的一个例子。您的解决方案可以修改为{.reduce(函数(行,聚合){.each(行,函数(值,度量){aggregate[metric]+=aggregate[metric]?value | | 0;});return aggregate;},{});