【问题标题】:Check frequence of ocurrences in each subitem in an array检查数组中每个子项的出现频率
【发布时间】:2021-12-11 17:51:03
【问题描述】:

我有一个返回类似的数组:

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

我需要返回“userID”的频率,但正如你所见,它是一个子项。

所以如果我这样做:

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

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

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

【问题讨论】:

  • array.forEach((v) => (v.userID === value && count++));,但您也可以将属性传递给您的函数以使其更可重用。 getOccurrence(array, value, prop) {... 然后array.forEach((v) => ((prop ? v[prop] : v) === value && count++));

标签: javascript arrays loops foreach frequency


【解决方案1】:

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

试试这个:

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

【讨论】:

  • 正是我需要的。谢谢!
【解决方案2】:

您将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 as 来获取出现次数

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

【讨论】:

    【解决方案3】:

    正如其他答案中提到的,您的问题在于将字符串值与每个迭代对象进行比较,而不是与对象的相关属性进行比较。要修复它,您只需在比较中访问 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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2011-09-09
      • 2016-08-24
      • 1970-01-01
      • 2017-07-18
      相关资源
      最近更新 更多