如何将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
相关产品推荐
相关产品推荐

