Как изменить массив вложенных объектов по типу ключевого значения в javascript

#javascript #arrays #object #nested-loops

#javascript #массивы #объект #вложенные циклы

Вопрос:

Я хотел бы знать, как изменить массив объектов в javascript.

то есть для obj измените value массив ключей на строку, когда value это массив

измените value строку ключа на array, когда value это string

кроме того, как преобразовать выходные данные в входные obj и (наоборот —

 function newObject(obj){
  var result = obj.map(e=>typeof e.value === "string" ?
  {...e, value: [e.value] } :
   e.value.map(value => ({...e,value})) 
  ).flat()
  console.log(result);
  return resu<

}


  

сценарий 1

 input:
obj =[
 { id: 0, key: "s1", value: ["listA","listB"], img:"" },
 { id: 1, key: "s2", value: ["listC"], img: "" },
 { id: 2, key: "s3", value: ["listD","listE","listF"], img: "" }
]

Expected output:
[
  { id: 0, key: "s1", value: "listA,listB", img:""},
  { id: 1, key: "s2", value: "listC", img:""},
  { id: 2, key: "s3", value: "listD,listE,listF", img:""}
]

  

сценарий 2

 input
[
  { id: 0, key: "s1", value: "listA,listB", img:""},
  { id: 1, key: "s2", value: "listC", img:""},
  { id: 2, key: "s3", value: "listD,listE,listF", img:""}
]

Expected Output
[
 { id: 0, key: "s1", value: ["listA","listB"], img:"" },
 { id: 1, key: "s2", value: ["listC"], img: "" },
 { id: 2, key: "s3", value: ["listD","listE","listF"], img: "" }
]

  

Комментарии:

1. Что произошло с listF в последнем объекте вашего выходного массива? (первый блок кода?)

2. @NickParsons спасибо за ответ, обновил код, был пропущен

3. arr.forEach(item => item.value = item.value.join('') и arr.forEach(item => item.value = item.value.split(',')

Ответ №1:

При использовании .map() вы можете вернуть новый объект со всеми свойствами и значениями текущего объекта ( ...o ) вместе со свойством обновления value . Свойство update value проверит, является ли o.value это массивом (проверяется с помощью Array.isArray ), если это так, оно .join() преобразует элементы в строку, это строка (т. Е.: не массив), оно будет .split() через запятые преобразовывать строку в массив.

Смотрите пример ниже:

 function newObject(arr){
  return arr.map(o => ({
    ...o,
    value: Array.isArray(o.value) ? o.value.join() : o.value.split(',')
  }));
}

const arr1 = [ { id: 0, key: "s1", value: ["listA","listB"], img:"" }, { id: 1, key: "s2", value: ["listC"], img: "" }, { id: 2, key: "s3", value: ["listD","listE","listF"], img: "" } ];
const arr2 = [ { id: 0, key: "s1", value: "listA,listB", img:""}, { id: 1, key: "s2", value: "listC", img:""}, { id: 2, key: "s3", value: "listD,listE,listF", img:""} ];

const res1 = newObject(arr1);
const res2 = newObject(arr2);
console.log(res1);
console.log(res2);  

Ответ №2:

мы можем использовать цикл for для достижения большей производительности

 let arr_1 = [
  { id: 0, key: "s1", value: ["listA","listB"], img:"" },
  { id: 1, key: "s2", value: ["listC"], img: "" },
  { id: 2, key: "s3", value: ["listD","listE","listF"], img: "" },

  { id: 0, key: "s1", value: "listA,listB", img:""},
  { id: 1, key: "s2", value: "listC", img:""},
  { id: 2, key: "s3", value: "listD,listE,listF", img:""}
]


const f = (arr) => {
  for(let i = 0; i < arr.length; i  ) {
    let x = arr[i].value        
    arr[i].value = Array.isArray(x) ? x.join() : x.split(',')
  }
console.log(arr)
}

f(arr_1)