
本文介绍如何从键值对结构的对象中提取所有数组值,合并为单一数组,并高效去除重复元素,最终获得唯一的 id 列表。适用于处理服务端返回的分组数据、缓存映射或树形结构扁平化等场景。
本文介绍如何从键值对结构的对象中提取所有数组值,合并为单一数组,并高效去除重复元素,最终获得唯一的 id 列表。适用于处理服务端返回的分组数据、缓存映射或树形结构扁平化等场景。
在 JavaScript 开发中,常遇到类似这样的数据结构:一个对象,其每个属性值是一个数字 ID 数组(例如按分类 ID 分组的资源列表),而我们需要从中提取出全部不重复的 ID。例如:
const testobj = {
"100": [295, 681, 15220],
"257": [295, 681, 1123]
};
目标是得到唯一 ID 数组:[295, 681, 15220, 1123](顺序可接受,但无重复)。
核心思路:提取 → 合并 → 去重 → 转回数组
- 提取所有数组:使用 Object.values(testobj) 获取所有值(即 [ [295, 681, 15220], [295, 681, 1123] ]);
- 合并为一维数组:利用 Array.prototype.concat() 配合展开语法 ... 实现扁平化:[].concat(...Object.values(testobj));
- 自动去重:将合并后的数组传入 new Set() —— Set 天然只保留唯一值;
- 转为标准数组:用扩展运算符 [...set] 将 Set 实例转为普通数组。
完整代码如下:
const testobj = {"100": [295, 681, 15220], "257": [295, 681, 1123]};
const uniqueIds = [...new Set([].concat(...Object.values(testobj)))];
console.log(uniqueIds); // [295, 681, 15220, 1123]
✅ 该方案简洁、高效(时间复杂度 O(n)),且兼容现代浏览器及 Node.js 环境(ES6+)。
⚠️ 注意事项:
- 若原始数据中存在 null、undefined 或非数字类型,Set 仍会保留它们(如需类型过滤,建议在合并后添加 .filter(Number.isInteger) 等校验);
- Object.values() 返回顺序与对象属性定义顺序一致(ECMAScript 2015+ 规范保证),因此结果顺序可预期,但不等同于“插入顺序绝对稳定”(若键为纯数字字符串,V8 引擎下通常按数值升序排列,实际应以业务逻辑为准,必要时可用 Object.keys().sort() 显式控制);
- 如需保持原始出现顺序(首次出现优先),当前方案已满足(Set 迭代顺序即插入顺序);
- 若需兼容 IE 或极老环境,可替换 Set 为 filter((v, i, a) => a.indexOf(v) === i),但性能显著下降,不推荐。
总结:结合 Object.values()、扩展运算符、Array.concat() 和 Set,三步完成嵌套对象数组的扁平化与去重,是现代 JavaScript 处理此类问题的标准范式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











