【问题标题】:Javascript count unique values of object property in an object array [duplicate]Javascript计算对象数组中对象属性的唯一值[重复]
【发布时间】:2021-01-02 09:25:00
【问题描述】:

当我有一个对象数组时,如何计算对象属性的唯一值?

let organisations = [
  {
    "id": 1,
    "name": "nameOne",
  },
  {
    "id": 2,
    "name": "nameTwo",
  },
  {
    "id": 3,
    "name": "nameOne",
  }
]

在这种情况下,我如何计算唯一组织名称的数量。这里的答案是两个,因为有两个唯一的名称。

这行不通

 var counts = this.filteredExtendedDeals.reduce(
        (organisations, name) => {
          counts[name] = (counts[name] || 0) + 1;
          return counts;
        },
        {}
      );
      return Object.keys(counts);

【问题讨论】:

  • 减少或过滤
  • @mplungjan 你没有指定问题的问题,但如果它没有尝试,现在包括
  • 这种尝试没有任何意义。您没有在显示的同一对象上运行,而是在函数之外返回。请使用 sn-p 编辑器创建minimal reproducible example
  • 您可以将地图与 Set 一起使用:new Set(organisations.map(({name}) => name)).size;
  • 减少,无需设置:const names = organisations.reduce((acc,org) => { if (acc.includes(org.name)) return acc; acc.push(org.name); return acc},[])

标签: javascript


【解决方案1】:

您可以将列表缩减为Set,然后获取size

const organisations = [
  { "id": 1, "name": "nameOne" },
  { "id": 2, "name": "nameTwo" },
  { "id": 3, "name": "nameOne" }
];

const uniqueItems = (list, keyFn) => list.reduce((resultSet, item) =>
    resultSet.add(typeof keyFn === 'string' ? item[keyFn] : keyFn(item)),
  new Set).size;

console.log(uniqueItems(organisations, 'name'));
console.log(uniqueItems(organisations, ({ name }) => name));

【讨论】:

  • 为什么要设置? const names = organisations.reduce((acc,org) => { if (acc.includes(org.name)) return acc; acc.push(org.name); return acc},[])
  • @mplungjan A Set 比检查 Array 项目索引更有效。查找是 O(1)。
猜你喜欢
  • 2022-01-11
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多