将对象数组中的对象属性总结为单个对象Lodash

时间:2016-07-19 02:41:19

标签: javascript arrays underscore.js lodash

我一直在努力做到这一点并且遇到了问题,所以我应该向ppl询问更多经验。我有一个对象数组,可以说是被称为项目,我需要总结数组中不同对象的一些属性,并在最后总结它们。用户可以进行一些选择,我只需要总结他们给我的数组中所选择的属性,所以我想也许可以在lodash中使用_.pick函数。如果可能的话,我想在一个循环中这样做,因为items数组最多可以有1000个项目。这是一个例子:

var items = [
{'lightBlue':4, 'darkBlue':2, 'red':4, 'orange':6, 'purple':7},
{'lightBlue':6, 'darkBlue':5, 'red':1, 'orange':2, 'purple':3},
{'lightBlue':2, 'darkBlue':4, 'red':3, 'orange':4, 'purple':9}
]

var userSelectedColors = ['lightBlue', 'darkBlue'];

我想看到的是所有蓝色的总结如下:

var summedUp = [{'lightBlue':12, 'darkBlue':11}];

然后总结结果以获得总数

var totalCount = 23

什么是在lodash中获得此功能的最佳和最佳方式。 userSelectedColors数组可以是1或任何颜色组合。

请提供一个例子,谢谢你的帮助,谢谢!

2 个答案:

答案 0 :(得分:9)

使用_.sumBy

var totalCount = _.sumBy(userSelectedColors, _.partial(_.sumBy, items));



var items = [
  { 'lightBlue': 4, 'darkBlue': 2, 'red': 4, 'orange': 6, 'purple': 7 },
  { 'lightBlue': 6, 'darkBlue': 5, 'red': 1, 'orange': 2, 'purple': 3 },
  { 'lightBlue': 2, 'darkBlue': 4, 'red': 3, 'orange': 4, 'purple': 9 }
], userSelectedColors = ['lightBlue', 'darkBlue'];

var totalCount = _.sumBy(userSelectedColors, _.partial(_.sumBy, items));

console.log(totalCount);

<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
&#13;
&#13;
&#13;

扩展,看起来像:

var totalCount = _.sumBy(userSelectedColors, function(prop) {
    return _.sumBy(items, prop);
});

如果没有Lodash,更高效的解决方案将是这样的:

var totalCount = items.reduce(function(total, obj) {
    return total + userSelectedColors.reduce(function(total, prop) {
        return total + obj[prop];
    }, 0);
}, 0);

&#13;
&#13;
var items = [
  { 'lightBlue': 4, 'darkBlue': 2, 'red': 4, 'orange': 6, 'purple': 7 },
  { 'lightBlue': 6, 'darkBlue': 5, 'red': 1, 'orange': 2, 'purple': 3 },
  { 'lightBlue': 2, 'darkBlue': 4, 'red': 3, 'orange': 4, 'purple': 9 }
], userSelectedColors = ['lightBlue', 'darkBlue'];

var totalCount = items.reduce(function(total, obj) {
    return total + userSelectedColors.reduce(function(total, prop) {
        return total + obj[prop];
    }, 0);
}, 0);

console.log(totalCount);
&#13;
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

就效率而言,我认为这很难被击败,因为它只在阵列中迭代一次,但它并不像@ 4castle那样简洁。 (另外,对于只有1000件商品,您无论如何都不会注意到性能差异。)

var items = [
    {'lightBlue':4, 'darkBlue':2, 'red':4, 'orange':6, 'purple':7},
    {'lightBlue':6, 'darkBlue':5, 'red':1, 'orange':2, 'purple':3},
    {'lightBlue':2, 'darkBlue':4, 'red':3, 'orange':4, 'purple':9}
]

var userSelectedColors = ['lightBlue', 'darkBlue'];

var sums = {};

_.each(items, function (item) {
    _.each(userSelectedColors, function (color) {
        sums[color] = (sums[color] || 0) + item[color];
    });
});

console.log('Summary: ', sums);

console.log('Grand total: ', _.sum(_.values(sums)));

输出:

Summary:  { lightBlue: 12, darkBlue: 11 }
Grand total:  23