You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将JSON对象数组的各键对应值分组为无重复的独立数组

实现对象数组按键分组去重的方案

以下是可直接运行的JavaScript实现,支持任意平面对象数组,会自动识别所有对象的键,对每个键对应的值自动去重后存入数组:

function groupAndDeduplicate(arr) {
  // 遍历数组聚合所有键的值,遍历过程中同步去重
  const result = arr.reduce((acc, currentObj) => {
    Object.entries(currentObj).forEach(([key, value]) => {
      // 键不存在时初始化空数组
      if (!acc[key]) acc[key] = []
      // 仅当值不存在时才存入数组,避免重复
      if (!acc[key].includes(value)) {
        acc[key].push(value)
      }
    })
    return acc
  }, {})
  return result
}

// 测试示例
const people = [
  {sex:"Male", name:"Jeff"},
  {sex:"Female", name:"Megan"},
  {sex:"Male", name:"Taylor"},
  {sex:"Female", name:"Madison"}
]

console.log(JSON.stringify(groupAndDeduplicate(people)))
// 输出结果完全符合要求:{"sex":["Male","Female"],"name":["Jeff","Megan","Taylor","Madison"]}

如果数据量较大,更推荐用Set实现去重,性能比includes方法更高:

function groupAndDeduplicate(arr) {
  const groupedSet = arr.reduce((acc, currentObj) => {
    Object.entries(currentObj).forEach(([key, value]) => {
      if (!acc[key]) acc[key] = new Set()
      acc[key].add(value)
    })
    return acc
  }, {})
  // 统一将Set转为普通数组
  return Object.fromEntries(
    Object.entries(groupedSet).map(([key, set]) => [key, [...set]])
  )
}

需要兼容不支持新语法的旧环境时可以用以下兼容写法:

function groupAndDeduplicate(arr) {
  var result = {}
  for (var i = 0; i < arr.length; i++) {
    var obj = arr[i]
    var keys = Object.keys(obj)
    for (var j = 0; j < keys.length; j++) {
      var key = keys[j]
      var value = obj[key]
      if (!result[key]) result[key] = []
      if (result[key].indexOf(value) === -1) {
        result[key].push(value)
      }
    }
  }
  return result
}

内容的提问来源于stack exchange,提问作者Vasanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:06:08