Я хотел бы знать, как изменить конкретное поле, передав тип параметра в 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" }
]

1
codecat 3 Сен 2020 в 11:19

2 ответа

Лучший ответ

Поскольку вы хотите сгенерировать несколько значений при преобразовании массива в строку, вы не можете напрямую использовать 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
Nick 3 Сен 2020 в 12:23

Два вопроса:

  • Вы поменяли местами случаи строки / массива: в первом случае вы хотите обернуть строки в массивы, но вы передаете «массив» в качестве второго аргумента, в то время как функция выполняет это обертывание, когда этот аргумент - «строка». Итак, либо вы передаете неверный аргумент, либо тернарное выражение должно иметь противоположное условие.

  • При преобразовании массива в строку вы в настоящее время применяете toString к массиву. Но это не увеличит количество объектов на выходе. Он просто создаст строку, разделенную запятыми, в одном единственном объекте.

Вы все еще можете использовать map для решения этой последней проблемы, но затем примените .flat для разрешения вложенного массива, который вы получите:

obj.map(e => str !== "string" 
           ? {...e, value: [e.value]} 
           : e.value.map(value => ({...e,value}) )
   ).flat();
0
trincot 3 Сен 2020 в 09:50