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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:39:18