Javascript - 从对象数组中获取数据

我得到了这个样本数据 .

"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 array并比较Id值并为该布尔值设置一些计数器 . 因此,在我深入了解每个解决方案之前,我想问一下是否有其他方法可以使用 . filter().reduce() 方法 .

回答(1)

2 years ago

您可以使用 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))