JavaScript按条件创建同结构对象及代码正确性校验
原有代码的正确性判断
你写的实现不正确,存在3个核心问题:
- 你把
reqBodyAddress.addressType赋值成了一个函数,但全程没有调用这个函数,最终做JSON序列化时,函数类型的属性会被直接忽略,根本得不到你预期的地址类型值。 - 即便你调用了这个函数,JS里直接用
+拼接两个对象,会把对象转成原始类型字符串,最终得到的是"[object Object][object Object]"这种无意义的字符串,完全不是合法的对象结构。 - 你定义的
{home:'home'}和{mailing:'mailing'}两个对象键名不一致,不符合你提到的“两个结构相同的对象”的要求,同结构对象应该保持键名统一,值做区分。
正确实现方案
根据需求,默认传递值为home的对象,条件为真时追加值为mailing的同结构对象,不需要多余的函数包裹,根据接口常见的两种参数要求,对应实现如下:
- 如果接口要求地址类型以对象数组形式传递(同结构条目最常用的传参格式):
var arrayObj = [] var reqBodyAddress = {}; reqBodyAddress.startDate = new GlideDateTime(current.u_data_inizio_contratto).getNumericValue(); // 初始化地址类型数组,默认放入home对象,键名value可根据接口实际要求替换,保证两个对象键名一致即可 reqBodyAddress.addressType = [{ value: 'home' }]; if (current.u_domicilio === true) { reqBodyAddress.addressType.push({ value: 'mailing' }); } arrayObj.push(reqBodyAddress); var sReqBodyData = JSON.stringify(arrayObj);
- 如果接口要求直接把多个类型键值对合并到同一个
addressType对象里(即不需要数组,addressType本身是对象,默认有home键,条件满足时多一个mailing键):
var arrayObj = [] var reqBodyAddress = {}; reqBodyAddress.startDate = new GlideDateTime(current.u_data_inizio_contratto).getNumericValue(); reqBodyAddress.addressType = { home: 'home' }; if (current.u_domicilio === true) { reqBodyAddress.addressType.mailing = 'mailing'; } arrayObj.push(reqBodyAddress); var sReqBodyData = JSON.stringify(arrayObj);
两种写法序列化后都是合法的JSON结构,你可以根据对接的接口实际参数要求选择对应写法即可。
内容的提问来源于stack exchange,提问作者fabrizio
相关产品推荐
相关产品推荐

