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



我有一个数组,它返回如下内容:

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",
},
]

并且我需要返回";用户ID";,但正如你所看到的,它是一个子项。

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

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)您可以使用过滤器作为获取事件

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);

最新更新