
本文介绍如何在 Node.js 中从 JSON 数组中高效提取所有对象共有的唯一键名,解决因直接对数组调用 Object.keys() 导致返回索引而非属性名的问题,并提供可复用的函数式实现。
本文介绍如何在 node.js 中从 json 数组中高效提取所有对象共有的唯一键名,解决因直接对数组调用 `object.keys()` 导致返回索引而非属性名的问题,并提供可复用的函数式实现。
当你使用 fs.readFileSync() 读取一个 JSON 文件并解析为 JavaScript 对象后,若该 JSON 是一个数组(如示例中的用户列表),那么 Object.keys(jsonData) 实际作用于数组实例本身——而数组的自有属性是数字索引('0', '1', '2'…),因此返回的是索引字符串,而非每个对象内部的字段名(如 "Name"、"primaryRegion")。
要获取所有对象中出现过的唯一键名,核心思路是:遍历数组中的每个对象,收集其所有键,并去重。推荐使用 Array.prototype.reduce() 配合 Set 实现简洁、高效且无副作用的方案:
const jsonData = JSON.parse(fs.readFileSync('./test/sampleData1.json', 'utf8'));
// 提取所有唯一键名
const uniqueKeys = [...jsonData.reduce((set, item) => {
Object.keys(item).forEach(key => set.add(key));
return set;
}, new Set())];
console.log(uniqueKeys); // ["Name", "primaryRegion"]✅ 优势说明:
-
Set天然去重,无需手动过滤重复字段; -
reduce累积处理,逻辑清晰,适合函数式风格; - 展开运算符
[...set]将Set转为标准数组,便于后续操作(如排序、映射等)。
⚠️ 注意事项:
- 若 JSON 数组为空(
[]),reduce将抛出错误(缺少初始值),建议添加空数组保护:const uniqueKeys = jsonData.length === 0 ? [] : [...jsonData.reduce((set, item) => { /* ... */ }, new Set())]; - 若对象结构不一致(例如部分对象含
"email"字段),该方法仍会正确汇总全部出现过的键——这正是“获取所有键”的预期行为;若需严格共有的键(交集),则应改用filter+every方式求交集。 - 生产环境中建议添加 JSON 解析异常处理:
try { const jsonData = JSON.parse(fs.readFileSync('./test/sampleData1.json', 'utf8')); // 后续处理... } catch (err) { console.error('Invalid JSON or file read error:', err.message); }
综上,通过 reduce + Set + Object.keys 组合,即可稳健、优雅地提取 JSON 数组中所有对象的唯一键名,适用于数据清洗、动态表头生成、Schema 推断等实际场景。


















