如何将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
相关产品推荐
相关产品推荐

