检查数组中每个子项的出现频率
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);
我有一个数组 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);