给定的是一个数据项数组,其中需要对每个属性的值进行总计,其中每个属性的键与另外提供的属性名(用作分组键)不同。
因此,对于分组密钥name
和样本数据如…
[{
name: "Name1",
amt: 100,
tax: 10,
total: 110,
}, {
name: "Name2",
amt: 50,
tax: 5,
total: 55,
}, {
name: "Name1",
amt: 70,
tax: 7,
total: 77,
}]
。预期的结果是。。
[{
name: "Name1",
amt: 170,
tax: 17,
total: 187,
}, {
name: "Name2",
amt: 50,
tax: 5,
total: 55,
}]
是否有一种方法或参考,使一个生产的输出像上面的一个?
3条答案
按热度按时间balp4ylt1#
从我上面的评论…
可以以完全通用的方式实现reduce方法的reducer回调函数。
为了提供分组键的名称,需要将对象作为初始值传递给
reduce
方法的第二个参数。这个物体可能看起来像...
...并且还充当累加器/收集器对象,它在每个迭代步骤中传递。任何实现都将在收集器最初为空的
result
对象上聚合最终的数据结构。选择一个对象提供了以可读的通用数据格式交付最终结果的优势,如......同时还能够利用nullish coalescing assignment operator /
??=
来创建不存在的组的初始数据或访问已经存在的组的数据。返回到当前处理的数组项,它的每个属性名称都是未知的。
在这里,我们利用了destructuring assignments,比如对象解构和rest属性。由于所提供的分组键名称已作为
key
提供并分配给变量key,
,因此需要计算属性名称的语法。因此,每个属性名未知的当前处理的数组项必须像......其中变量
keyValue
保存name
-keys的值,而restData
是一个对象,它的特征是每隔一个键值对(条目),而不是基于name
-key的键值对。至于OP的第一个数据项...
.
keyValue
被分配了"Name1"
,restData
引用了.为了计算一个组的每个同名属性值的总量,需要迭代每个
restData
对象的entries
。restData
的For each键-值对(再次在无效合并赋值的帮助下)或者最初创建基于数据键的属性并将零/0
赋值给它,或者/并且通过当前数据值对已经存在的属性的值求和(总计)。OP请求的最终数据结构通过将返回的
result
对象传递给Object.values
来实现。tnkciper2#
您可以通过键值将每个对象缩减为一个贴图。对于每一项,循环键并忽略
key
参数。将传入的
item[k]
与existing[k]
项相加。最后,返回
Map
的values()
,并将迭代器扩展为新的Array
对象。fzsnzjdm3#
使用
Array::reduce()
构造一个新数组,记住map中的元素名称,并将它们保存到结果数组中,然后使用map用新的总数更新元素: