将对象数组中的对象属性汇总为单个对象 Lodash
sum up object properties in array of objects into a single object Lodash
我一直在努力解决这个问题,但遇到了一些问题,所以我想我应该问问有更多经验的人。我有一个对象数组,可以说称为项目,我需要总结数组中不同对象的一些属性,并在最后总结它们。用户可以进行一些选择,我只需要总结他们给我的数组中唯一选择的属性,所以我想也许可以在 lodash 中使用 _.pick 函数。如果可能的话,我想在一个循环中这样做,因为项目数组最多可以有 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 或颜色的任意组合。
请提供示例,感谢您的帮助!
使用_.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>
展开后,看起来像:
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);
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);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
就效率而言,我认为这是无可匹敌的,因为它只遍历数组一次,但它不像@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
获取摘要
var summary = userSelectedColors.map(c => ({ [c]: _.sumBy(items, c)}))
总计
var total = _.sum(Object.values(summary))
我一直在努力解决这个问题,但遇到了一些问题,所以我想我应该问问有更多经验的人。我有一个对象数组,可以说称为项目,我需要总结数组中不同对象的一些属性,并在最后总结它们。用户可以进行一些选择,我只需要总结他们给我的数组中唯一选择的属性,所以我想也许可以在 lodash 中使用 _.pick 函数。如果可能的话,我想在一个循环中这样做,因为项目数组最多可以有 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 或颜色的任意组合。
请提供示例,感谢您的帮助!
使用_.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>
展开后,看起来像:
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);
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);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
就效率而言,我认为这是无可匹敌的,因为它只遍历数组一次,但它不像@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
获取摘要
var summary = userSelectedColors.map(c => ({ [c]: _.sumBy(items, c)}))
总计
var total = _.sum(Object.values(summary))