【问题标题】:How can i count the number of identical objects by keys in an array? [closed]如何通过数组中的键计算相同对象的数量? [关闭]
【发布时间】:2021-06-15 12:21:48
【问题描述】:

我有一个对象数组:

[
  { appleID: 13, bananaID: 55 },
  { appleID: 24, bananaID: 13}, 
  { appleID: 97, bananaID: 13},
  { appleID: 13, bananaID: 55 }
]

结果应该是这样的:

[
  { appleID: 13, bananaID: 55, count: 2 },
  { appleID: 24, bananaID: 13, count: 1}, 
  { appleID: 97, bananaID: 13, count: 1}
]

按element === appleID && element === bananaID计算相同元素的个数

【问题讨论】:

  • 到目前为止你尝试过什么?你应该向我们展示你的代码你正在尝试什么:)

标签: javascript arrays sorting object javascript-objects


【解决方案1】:

您可以使用.reduce 通过以下 2 项来汇总您的数据:

  1. 关键思想是使用const key = ${appleID}-${bananaID} 之类的格式构建key
  2. 使用在性能方面,可以使用object获得最高性能(查找只需要O(1))
    const data = [
      { appleID: 13, bananaID: 55 },
      { appleID: 24, bananaID: 13}, 
      { appleID: 97, bananaID: 13},
      { appleID: 13, bananaID: 55 }
    ];
    
    const result = data.reduce((acc, {appleID, bananaID}) => {
      const key = `${appleID}-${bananaID}`
      acc[key] ??= {appleID, bananaID, count: 0};
      acc[key]["count"] += 1;
      
      return acc;
    }, {});
    
    console.log(Object.values(result));

【讨论】:

  • @Vladislav 这能回答你的问题吗?如果您需要任何帮助,请告诉我:)
【解决方案2】:

const data = [
  { appleID: 13, bananaID: 55 },
  { appleID: 24, bananaID: 13}, 
  { appleID: 97, bananaID: 13},
  { appleID: 13, bananaID: 55 }
]

function countNum(arr){
    return arr.reduce((pre, item) => {
        const hasItem = pre.find(subItem => subItem.appleID === item.appleID && subItem.bananaID === item.bananaID)
        if(hasItem){
            hasItem.count++
        }else{
            pre.push({...item, count: 1})
        }
        return pre
    }, [])
}

console.log(countNum(data))

喜欢这个

function countNum(arr){
    return arr.reduce((pre, item) => {
        const hasItem = pre.find(subItem => subItem.appleID === item.appleID && subItem.bananaID === item.bananaID)
        if(hasItem){
            hasItem.count++
        }else{
            pre.push({...item, count: 1})
        }
        return pre
    }, [])
}

【讨论】:

  • 在性能方面,你的代码太慢了,兄弟。其实你可以使用object来获得最高性能(查找只需O(1))
猜你喜欢
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 1970-01-01
相关资源
最近更新 更多