检查数组中每个子项的出现频率

Check frequence of ocurrences in each subitem in an array

我有一个数组 return 类似于:

const arr = [
    {
        "id": "5ac2f57f-61cf-454b-9457-484b8484c1d3",
        "userID": "7d21e968-f32a-4cb9-a0db-dd98d1d2973a",
        "tag": "REPORT_CREATE",
    },
    {
        "id": "3d302f03-75da-40cf-8b86-d9673fdc3b4a",
        "userID": "1dafdb46-a49e-4194-9e5b-9c44be7e4cda",
        "tag": "REPORT_CREATE",
    },
]

我需要return“userID”的频率,但如您所见,它是一个子项。

所以如果我做类似的事情:

function getOccurrence(array, value) {
   var count = 0;
   array.forEach((v) => (v === value && count++));
   return count;
}

console.log(getOccurrence(arr, "userIDsomething"));

那不行,因为 userID 必须是对象本身,而不是在 [0]、[1] 等内部。但我被困在那里。有什么建议吗?

您只需将 value 与数组中项目的 userID 属性 进行比较,而不是与项目本身进行比较。此外,它可能会简化您的代码以使用 filter.

试试这个:

function getOccurrence(array, value) {
   return array.filter((v) => v.userID === value).length;
}

您正在将 value 与永远不相等的对象进行比较,您必须将 value 与其 userID 进行比较,使用 v.userID 作为

array.forEach((v) => v.userID === value && count++);

1) 这里可以使用reduce

arr.reduce((acc, curr) => (curr.userID === value ? ++acc : acc), 0)

const arr = [
  {
    id: "5ac2f57f-61cf-454b-9457-484b8484c1d3",
    userID: "7d21e968-f32a-4cb9-a0db-dd98d1d2973a",
    tag: "REPORT_CREATE",
  },
  {
    id: "3d302f03-75da-40cf-8b86-d9673fdc3b4a",
    userID: "1dafdb46-a49e-4194-9e5b-9c44be7e4cda",
    tag: "REPORT_CREATE",
  },
];

function getOccurrence(array, value) {
  return arr.reduce((acc, curr) => (curr.userID === value ? ++acc : acc), 0);
}

console.log(getOccurrence(arr, "1dafdb46-a49e-4194-9e5b-9c44be7e4cda"));

2) 你可以使用 filter 作为

arr.filter((o) => o.userID === value).length

const arr = [
  {
    id: "5ac2f57f-61cf-454b-9457-484b8484c1d3",
    userID: "7d21e968-f32a-4cb9-a0db-dd98d1d2973a",
    tag: "REPORT_CREATE",
  },
  {
    id: "3d302f03-75da-40cf-8b86-d9673fdc3b4a",
    userID: "1dafdb46-a49e-4194-9e5b-9c44be7e4cda",
    tag: "REPORT_CREATE",
  },
];

function getOccurrence(array, value) {
  return arr.filter((o) => o.userID === value).length;
}

console.log(getOccurrence(arr, "1dafdb46-a49e-4194-9e5b-9c44be7e4cda"));

如其他答案中所述,您的问题在于将字符串值与每个迭代对象进行比较,而不是与对象的相关 属性 进行比较。要修复它,您只需访问比较中的 useID

array.forEach((v) => (v.userID === value && count++));

除此之外,您的方法还不错,并且不会像 filter().length 快捷方式那样产生创建新数组的副作用。

但是将 userID 硬编码为实用函数并没有多大意义,因此您可以在函数中接受第三个 property 参数来指定 属性 进行比较。这里使用 for...of 而不是 forEach() 并检查 property 是否通过,如果不是直接比较。

const arr = [{'id': '5ac2f57f-61cf-454b-9457-484b8484c1d3','userID': '7d21e968-f32a-4cb9-a0db-dd98d1d2973a','tag': 'REPORT_CREATE',},{'id': '3d302f03-75da-40cf-8b86-d9673fdc3b4a','userID': '1dafdb46-a49e-4194-9e5b-9c44be7e4cda','tag': 'REPORT_CREATE',},];

function getOccurrence(array, value, prop) {
  let count = 0;
  for (const v of array) {
    (prop !== undefined ? v[prop] : v) === value && count++;
  }

  return count;
}

const count = getOccurrence(arr, '1dafdb46-a49e-4194-9e5b-9c44be7e4cda', 'userID');

console.log('1dafdb46-a49e-4194-9e5b-9c44be7e4cda: ', count);