我得到了这个样本数据。
"array" : [
{"Id" : "1", "preferred" : false},
{"Id" : "1", "preferred" : true },
{"Id" : "2", "preferred" : false},
{"Id" : "2", "preferred" : false},]
我想摆脱这种情况。
"array2":[{"Id": 1, numOfTrue: 1, numOfFalse: 1},{"Id": 2, numOfTrue: 0, numOfFalse: 2}]
到目前为止,我得到的是一种如何从初始数组中获得唯一id的方法。
const unique = [...new Set(array.map(item => Id))];
下一步将是一些forEach over数组并比较ID值,并为该布尔值设置一些计数器。因此,在深入研究forEach解决方案之前,我想问一下使用。filter()
和.reduce()
方法是否还有另一种方法。
答案 0 :(得分:1)
您可以使用reduce()
来构建键为Id
的分组对象。每次您看到Id
再次在相应的键处递增该值。最后,您的数组将是对象的Object.values()
:
let array = [
{"Id" : "1", "preferred" : false},
{"Id" : "1", "preferred" : true },
{"Id" : "2", "preferred" : false},
{"Id" : "2", "preferred" : false}
]
let counts = array.reduce((counts, {Id, preferred}) => {
// If you haven't seen this Id yet, make a new entry
if (!counts[Id]) counts[Id] = {Id, numOfTrue: 0, numOfFalse: 0}
// increment the appropriate value:
if (preferred) counts[Id].numOfTrue++
else counts[Id].numOfFalse++
return counts
}, {})
// get the values array of the object:
console.log(Object.values(counts))