通过在javascript中传递参数来更改嵌套数组对象

通过在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; }

我想知道如何通过在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;
}

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();