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

如何将JSON对象追加到另一个JSON?循环追加实现遇阻求助

解决动态给Request JSON添加属性的问题

我来帮你分析下两种写法的问题,再给出正确的实现方式:

问题分析

第一种写法的问题

你在forEach循环里每次创建了新的obj对象,但完全没有把这些属性合并到request上,所以request始终只有初始的type和kaiId两个属性,自然达不到预期效果。

第二种写法的问题

这里有语法错误:var obj[element]=true既没有先声明obj变量,也不能用这种方式直接给未定义的对象赋值;同样,就算修正了语法,你也没把属性关联到request对象上。

正确实现方式

要达到预期的输出,我们需要直接在request对象上动态添加属性,同时处理TypeScript的类型限制(默认object类型不允许添加新属性):

方案一:使用forEach直接赋值

export function setCapabilities(kaiId: number | "default" | "defaultLeft" | "defaultRight", capabilitiesArr: string[]) {
  // 用Record<string, any>类型允许动态添加任意属性,也可以用{}让TS自动推断类型
  const request: Record<string, any> = { 
    type: 'setCapabilities', 
    kaiId: kaiId 
  };

  capabilitiesArr.forEach(element => {
    // 直接给request添加对应属性
    request[element] = true;
  });

  console.log(request);
  // 可选:如果需要返回这个对象,可以加上return request
}

// 调用测试
setCapabilities('default', ['1','2','3']);

方案二:使用reduce构建对象(更函数式的写法)

export function setCapabilities(kaiId: number | "default" | "defaultLeft" | "defaultRight", capabilitiesArr: string[]) {
  const request = capabilitiesArr.reduce((acc, element) => {
    acc[element] = true;
    return acc;
  }, { 
    type: 'setCapabilities', 
    kaiId: kaiId 
  } as Record<string, any>);

  console.log(request);
}

关键要点

  • 类型处理:TypeScript中object类型是只读的,无法添加新属性,所以我们用Record<string, any>或者直接用对象字面量让TS推断类型,来允许动态添加属性。
  • 直接操作目标对象:所有属性添加操作都要直接作用在request上,而不是创建无关的新对象。

内容的提问来源于stack exchange,提问作者tushar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:32:30