Javascript 计算对象数组中对象属性的唯一值

F_S*_*O_K -2 javascript

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

let organisations = [
  {
    "id": 1,
    "name": "nameOne",
  },
  {
    "id": 2,
    "name": "nameTwo",
  },
  {
    "id": 3,
    "name": "nameOne",
  }
]
Run Code Online (Sandbox Code Playgroud)

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

这不起作用

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

Mr.*_*irl 5

您可以将列表缩小为 a 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));
Run Code Online (Sandbox Code Playgroud)

如果您还想过滤掉nullundefined值:

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

const uniqueItemsNonNull = (list, keyFn) => list.reduce((resultSet, item) =>
    (v => v !== null && v !== undefined ? resultSet.add(v) : resultSet)
    (typeof keyFn === 'string' ? item[keyFn] : keyFn(item)),
  new Set).size;

console.log(uniqueItemsNonNull(organisations, 'name'));
console.log(uniqueItemsNonNull(organisations, ({ name }) => name));
Run Code Online (Sandbox Code Playgroud)

  • @mplungjan “Set”比检查“Array”项索引更有效。查找时间复杂度为 O(1)。 (2认同)