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

时间:2018-12-09 17:43:21

标签: javascript ecmascript-6

我得到了这个样本数据。

"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()方法是否还有另一种方法。

1 个答案:

答案 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))