JavaScript中如何将父对象键名追加到对应数组的所有子项中
实现方案
核心逻辑是遍历原对象的所有顶层键,将键名作为set字段的值,追加到对应数组的每一个子项中,根据是否需要保留原始数据不被修改,可选择以下两种实现方式:
1. 直接修改原对象(无额外内存开销)
如果不需要保留原始输入对象的结构,直接遍历修改即可,写法最简洁:
const input = { "groupA": [ {data: 'foo'}, {data: 'bar'} ], "groupB": [ {data: 'hi'}, {data: 'mom'} ] }; for (const [setName, list] of Object.entries(input)) { list.forEach(item => { item.set = setName; }); }
执行完成后input变量就是你需要的目标结构。
2. 生成新对象(不修改原始输入,无副作用)
如果后续逻辑还需要用到原始输入数据,建议生成全新的结果对象,避免修改原数据带来的隐性问题:
现代JS环境写法(支持ES2019及以上)
用Object.fromEntries配合map遍历实现,代码更简洁:
const input = { "groupA": [ {data: 'foo'}, {data: 'bar'} ], "groupB": [ {data: 'hi'}, {data: 'mom'} ] }; const result = Object.fromEntries( Object.entries(input).map(([setName, list]) => [ setName, list.map(item => ({...item, set: setName})) ]) );
老旧环境兼容写法
如果需要兼容不支持Object.fromEntries、对象展开运算符的环境,可以用基础循环实现:
const input = { "groupA": [ {data: 'foo'}, {data: 'bar'} ], "groupB": [ {data: 'hi'}, {data: 'mom'} ] }; const result = {}; for (const setName in input) { if (Object.prototype.hasOwnProperty.call(input, setName)) { result[setName] = input[setName].map(function(item) { return Object.assign({}, item, {set: setName}); }); } }
输出结果校验
以上所有写法最终得到的结构完全匹配你的预期:
{ "groupA": [ {"data": "foo", "set": "groupA"}, {"data": "bar", "set": "groupA"} ], "groupB": [ {"data": "hi", "set": "groupB"}, {"data": "mom", "set": "groupB"} ] }
提示:如果你的数组子项存在深层嵌套属性,上面的浅拷贝写法只会复制第一层属性,若需要完全隔离原数据和新数据的关联,可以替换为深拷贝逻辑,针对你给出的扁平数据结构,上述写法完全满足需求。
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

