通过在javascript中传递参数来更改嵌套数组对象
我想知道如何通过在javascript中传递参数类型来更改特定字段 我有对象obj1,obj2,如果参数类型是字符串/数组,请更改值字段 如预期输出所示,反之亦然通过在javascript中传递参数来更改嵌套数组对象,javascript,arrays,object,Javascript,Arrays,Object,我想知道如何通过在javascript中传递参数类型来更改特定字段 我有对象obj1,obj2,如果参数类型是字符串/数组,请更改值字段 如预期输出所示,反之亦然 function ChangeObj(obj, str){ var result = obj.map(e=> str==="string" ? ({...e, value:[e.value]}) : ({...e,value: e.value.toString()}) ) return result; }
function ChangeObj(obj, str){
var result = obj.map(e=> str==="string" ? ({...e, value:[e.value]}) : ({...e,value: e.value.toString()}) )
return result;
}
var obj1 =[
{ key: "country", id:0, value: "SG"},
{ key: "city", id:1, value: "IN"}
]
var obj2 = [
{ key: "cn", id:0, value: ["TH","MY"],img:"sample.jpg"},
{ key: "list", id:1, value: ["AU"], img:"item.jpg" }
]
var output1 = this.ChangeObj(obj1, "array");
var output2 = this.ChangeObj(obj2, "string");
Expected Output:
//output 1
[
{ key: "country", id:0, value: ["SG"] },
{ key: "city", id:1, value: ["IN"] }
]
// output 2
[
{ key: "cn", id:0, value: "TH", img:"sample.jpg"},
{ key: "cn", id:0, value: "MY", img:"sample.jpg" },
{ key: "list", id:1, value: "AU", img:"item.jpg" }
]
因为在将数组转换为字符串时要生成多个值,所以不能直接使用
map
。相反,您可以使用reduce
,然后在reduce
中使用map
对象值属性:
功能更改obj(obj,str){
var result=obj.reduce((c,o)=>c.concat(str==“数组”?[{…o,
价值:[o.value]
}]:o.value.map(v=>({…o,
值:v
}))), []);
返回结果;
}
var obj1=[
{键:“国家”,id:0,值:“SG”},
{key:“city”,id:1,value:“IN”}
]
变量obj2=[
{key:“cn”,id:0,值:[“TH”,“MY”],img:“sample.jpg”},
{key:“list”,id:1,值:[“AU”],img:“item.jpg”}
]
var output1=this.ChangeObj(obj1,“数组”);
var output2=this.ChangeObj(obj2,“字符串”);
控制台日志(output1);
控制台日志(output2)代码>两个问题:
- 您颠倒了字符串/数组的情况:在第一种情况下,您希望将字符串包装到数组中,但将“array”作为第二个参数传递,而函数在该参数为“string”时执行此包装。所以要么你传递了错误的参数,要么三元表达式应该有相反的条件
- 将数组转换为字符串时,您当前正在对数组应用
toString
。但这不会使输出中的对象数量成倍增加。它只会在一个对象中生成一个逗号分隔的字符串
您仍然可以使用map
来解决最后一个问题,但随后应用.flat
来解决将得到的嵌套数组:
obj.map(e => str !== "string"
? {...e, value: [e.value]}
: e.value.map(value => ({...e,value}) )
).flat();