js数据去重合并的问题

BlankSpace
  • 49

一个数组里若干个对象

[
  {
    id: 1,
    keyValue: "1.1.1.1",
    nameValue: "aws:SourceIp",
    operateValue: "IpAddress"
  },
 {
    id: 2,
    keyValue: "2.2.2.2",
    nameValue: "aws:SourceIp",
    operateValue: "IpAddress"
  },
 {
    id: 3,
    keyValue: "1.1.1.1",
    nameValue: "aws:SourceIp",
    operateValue: "IpAddress"
  }
]

当几个对象做比较的时候,operateValue的值如果一样
就将keyValue的值合并到一个数组里,并且去重
那么最终得到的结果就是

[
  {
    id: 1, // 任意id都可以
    keyValue: ["1.1.1.1","2.2.2.2"],
    nameValue: "aws:SourceIp",
    operateValue: "IpAddress"
  }
]

请问怎么处理?谢谢大佬们了!!

回复
阅读 1.8k
2 个回答
边城
  • 53.8k
✓ 已被采纳
const result = Object
    .values(
        // 先按 operateValue 分组,分组的 key 不重要,只需要把 values 取出来处理
        data.reduce((groups, it) => {
            (groups[it.operateValue] ??= []).push(it);
            return groups;
        }, {})
    )
    .map(it => ({   // values 每个元素都是个数组,需要组合这个数组的每个 keyValue
        ...it[0],
        keyValue: [...new Set(it.map(({ keyValue }) => keyValue))]
    }));

运行结果

[
  {
    id: 1,
    keyValue: [ '1.1.1.1', '2.2.2.2' ],
    nameValue: 'aws:SourceIp',
    operateValue: 'IpAddress'
  }
]
function merge(list) {
  const record = new Map()
  const mergedList = list.filter((item, index) => {
    const { keyValue, operateValue } = item

    if (!record.has(operateValue)) {
      record.set(operateValue, index)

      // 此处会将 keyValue 统一处理成 Set,尽管最后如果这个 keyValue 只含有一个值
      if (!Array.isArray(item.keyValue)) {
        item.keyValue = new Set([item.keyValue])
      }

      return true
    }

    const recordedIndex = record.get(operateValue)
    list[recordedIndex].keyValue.add(keyValue)

    return false
  })

  // 如果可以接受处理后的 keyValue 是一个 Set 对象那这一步就可以不要了
  mergedList.forEach(item => {
    item.keyValue = Array.from(item.keyValue)
  })

  return mergedList
}
宣传栏