如何将数组元素动态添加到现有JSON对象(类array.push方法)
解答
JavaScript 普通对象(构造JSON payload使用的Plain Object)没有类似数组push的内置方法,但可以通过方括号动态属性赋值的方式直接给对象注入新的键值对,这也是处理动态键名场景的标准方案。
原代码存在的问题
- 语法错误:代码中
$ { customFields[ix] }是错误写法,模板字符串需要用反引号包裹,且${}中间不能有多余空格;就算修正语法,也不符合传入的customFields数据结构 - 取值逻辑错误:传入的
customFields是单键对象组成的数组,每个元素结构为{自定义字段名: 字段值},并非直接存储字段名或字段值的基础类型数组,直接将数组元素作为键/值赋值会得到不符合预期的结果 - 缺少边界兼容:没有给
customFields设置默认值,当请求体未传该参数时,访问length属性会直接抛出异常
修正后可运行代码
const createIssueApi = async(req, res, next) => { try { let { projectKey, summary, description, issueType, customFields = [] // 增加默认空数组,兼容未传参场景 } = req.body; console.log(req.body) let jiraIssue = { "fields": { "project": { "key": projectKey }, "summary": summary, "description": description, "issuetype": { "name": issueType } } } // 遍历自定义字段数组,注入到fields对象中 for (const fieldItem of customFields) { const [fieldKey, fieldValue] = Object.entries(fieldItem)[0]; jiraIssue.fields[fieldKey] = fieldValue; } // 更简洁的写法:直接合并对象,和上面循环效果完全一致 // jiraIssue.fields = Object.assign(jiraIssue.fields, ...customFields) console.log("Jira Issue payload: ", jiraIssue) // 后续补充调用Jira接口的业务逻辑即可 } catch (e) { console.log(e) } }
最终生成的payload结构
传入你给出的请求参数时,最终输出的jiraIssue结构完全符合接口要求:
{ "fields": { "project": { "key": "JK" }, "summary": "summary text", "description": "THIS IS JUST A TEST", "issuetype": { "name": "Submit a request or incident" }, "customfield_123456": "value1", "customfield_7890": "value2" } }
提示:发送请求时不需要手动将对象序列化为JSON字符串,主流HTTP请求库(axios、fetch等)会自动完成序列化处理,直接传入普通JS对象即可。
内容的提问来源于stack exchange,提问作者user3569450
相关产品推荐
相关产品推荐

