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

时间:2020-09-03 08:19:49

标签: 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;
}

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" }
]

2 个答案:

答案 0 :(得分:1)

由于要在将数组转换为字符串时生成多个值,因此不能直接使用map。相反,您可以使用reduce,然后使用map中的reduce对象值属性:

function ChangeObj(obj, str) {
  var result = obj.reduce((c, o) => c.concat(str === "array" ? [{ ...o,
    value: [o.value]
  }] : o.value.map(v => ({ ...o,
    value: v
  }))), []);
  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");

console.log(output1);
console.log(output2);

请注意,您的三元条件是错误的,我已在此代码中将其更正为str === "array"

答案 1 :(得分:0)

两个问题:

  • 您颠倒了字符串/数组的大小写:在第一种情况下,您想将字符串包装在数组中,但是将“ array”作为第二个参数传递,而当该参数为“ string”时,函数将执行这种包装。因此,要么您传递了错误的参数,要么三元表达式应该具有相反的条件。

  • 将数组转换为字符串时,当前正在将<div class="ms__slide" style="background-image: url('../images/slider-bg.jpg')"> </div>应用于数组。但这不会增加输出中对象的数量。它将在一个对象中产生一个逗号分隔的字符串。

您仍然可以使用toString解决最后一个问题,但是然后应用map来解决将要获得的嵌套数组:

.flat