#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)