使用数组中的多个属性进行高效对象分组
对数组中的对象进行分组的任务可以扩展到单个属性之外;在某些情况下,需要考虑多个属性进行分组。在这种情况下,需要定制的方法。
让我们解决根据形状和颜色对对象进行分组的问题。目标是将具有相同形状和颜色的对象分组,同时汇总其使用值和实例值。
预期行为:
const arr = [ { shape: 'square', color: 'red', used: 1, instances: 1 }, { shape: 'square', color: 'red', used: 2, instances: 1 }, { shape: 'circle', color: 'blue', used: 0, instances: 0 }, { shape: 'square', color: 'blue', used: 4, instances: 4 }, { shape: 'circle', color: 'red', used: 1, instances: 1 }, { shape: 'circle', color: 'red', used: 1, instances: 0 }, { shape: 'square', color: 'blue', used: 4, instances: 5 }, { shape: 'square', color: 'red', used: 2, instances: 1 } ]; const expectedResult = [ { shape: "square", color: "red", used: 5, instances: 3 }, { shape: "circle", color: "red", used: 2, instances: 1 }, { shape: "square", color: "blue", used: 11, instances: 9 }, { shape: "circle", color: "blue", used: 0, instances: 0 } ];
关键注意事项:
解决方案:
利用 Array#reduce,我们可以迭代数组,同时维护一个辅助对象来跟踪形状-颜色组合。
对于每个对象:
如果在辅助对象中找不到该键:
如果键已在辅助对象中:
此过程有效地将具有相同形状和颜色的对象分组,同时累积其值。
代码片段:
const arr = [ { shape: 'square', color: 'red', used: 1, instances: 1 }, { shape: 'square', color: 'red', used: 2, instances: 1 }, { shape: 'circle', color: 'blue', used: 0, instances: 0 }, { shape: 'square', color: 'blue', used: 4, instances: 4 }, { shape: 'circle', color: 'red', used: 1, instances: 1 }, { shape: 'circle', color: 'red', used: 1, instances: 0 }, { shape: 'square', color: 'blue', used: 4, instances: 5 }, { shape: 'square', color: 'red', used: 2, instances: 1 } ]; let helper = {}; const result = arr.reduce((r, o) => { const key = `${o.shape}-${o.color}`; if (!helper[key]) { helper[key] = Object.assign({}, o); r.push(helper[key]); } else { helper[key].used += o.used; helper[key].instances += o.instances; } return r; }, []); console.log(result);
输出始终正确,符合预期结果:
[ { shape: 'square', color: 'red', used: 5, instances: 3 }, { shape: 'circle', color: 'red', used: 2, instances: 1 }, { shape: 'square', color: 'blue', used: 11, instances: 9 }, { shape: 'circle', color: 'blue', used: 0, instances: 0 } ]
通过利用此技术,您可以根据多个属性有效地对值进行分组和求和,使您能够处理数组中复杂的数据操作任务。
以上是如何通过多个属性有效地将数组中的对象分组并汇总它们的值?的详细内容。更多信息请关注PHP中文网其他相关文章!