【问题标题】:How to get repeated objects in json array in javascript如何在javascript中获取json数组中的重复对象
【发布时间】:2020-03-16 08:44:53
【问题描述】:

我有一个这样的 JSON 数组:

var data = [
      {title: "HH02"},
      {title: "HH03"},
      {title: "HH04"},
      {title: "HH02"},
      {title: "HH07"},
      {title: "HH08"},
      {title: "HH08"},
      {title: "HH10"},
      {title: "HH02"},
      {title: "HH11"}
]

首先我想像这样在 JSON 数组中获取重复的对象:

var output = [
     {title: "HH02" },
     {title: "HH08" },
]

然后我想获取所有重复的对象以及它们在另一个这样的 JSON 数组中重复的次数

var output = [
     {title: "HH02" , repeat: 3},
     {title: "HH08" , repeat: 2},
]

我试过这样做,但效果不佳:

data.map(v => v.title).sort().sort((a, b) => {
                    if (a === b) output.push(a);
                })

【问题讨论】:

标签: javascript arrays json


【解决方案1】:

您可以使用reduce, filter and map

  • 首先将所有值按title 分组,重复计数
  • 过滤出现一次或少于一次的titles(排除它们)
  • 映射它们以获得所需的输出

var data = [{title: "HH02"},{title: "HH03"},{title: "HH04"},{title: "HH02"},{title: "HH07"},{title: "HH08"},{title: "HH08"},{title: "HH10"},{title: "HH02"},{title: "HH11"}]

let final = [...data.reduce((op, inp) => {
  let title = inp.title
  op.set(title, (op.get(title) || 0) + 1)
  return op
}, new Map()).entries()].filter(([_,repeat]) => repeat > 1).map(([title, repeat]) => ({
  title,
  repeat
}))

console.log(final)

【讨论】:

    【解决方案2】:

    您可以为此使用 lodash groupBy。

    这里是链接https://lodash.com/docs/4.17.15#groupBy

    它将返回一个 JSON 对象,其中标题为键,该键下的项目数组作为其值。

    该值的长度将返回所需的计数。

    【讨论】:

      【解决方案3】:

      除了对数组本身进行排序之外,我绝不会建议在排序回调中使用副作用。尝试在 Object.keys(...) 上进行 reduce,然后是过滤器和映射:

      const countMap = data.reduce((result, element) => {
          result[element.title] = (result[element.title] || 0) + 1;
          return result;
      }, {});
      const result = Object.keys(countMap).filter(title => countMap[title] > 1).map(title => {
          return {title, repeat: countMap[title]};
      });
      

      【讨论】:

        【解决方案4】:

        你可以用reduce统计重复的对象,用filter过滤掉它们

        Object.values(data.reduce((acc, value) => {
          const repeat = acc[value.title] ? acc[value.title].repeat + 1 : 1;
          acc[value.title] = { repeat: repeat, ...value };
          return acc;
        }, {})).filter(value => value.repeat > 1);
        

        【讨论】:

        • 您应该添加一些评论。仅代码答案不是高质量的答案。
        猜你喜欢
        • 2021-09-14
        • 2018-06-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 2020-10-02
        相关资源
        最近更新 更多