С помощью объекта я могу клонировать и добавлять:
let newObject = {
...obj,
[key]: {
...obj[key],
thing: true }
}
Таким образом, это добавляет некоторые объекты в массив, затем обновляется одно свойство объекта. Я знаю, что индекс элемента обновляется, но не хочет переопределять существующие свойства.
Теперь я хочу сделать то же самое для массива:
let newArray = [
...arr,
[key]: {
...arr[key],
thing: true }
]
Что может сделать то же, что и выше.
Но это не работает.
Должен ли {key}:thing
работать? Я помню, как читал это где-то, может быть, его ES7?
Я мог бы сделать:
let newArray = arr.map((item, key) => key === index ? { ...item, thing: true } : item);
Но я надеялся на более чистый синтаксис. Я не соглашусь, если нет подобного синтаксиса.
Вы можете использовать Object.assign()
:
const arr = [{ a: 1 }, { b: 1 }, { c: 1 }];
const index = 1;
const newArr = Object.assign([], arr, { [index]: { ...arr[index], thing: true } });
console.log(newArr);
Массивы не имеют ключей, поэтому синтаксис, который вы используете, не работает. Это массив объектов? Если так...
EDIT - основываясь на вашем комментарии, попробуйте следующее:
// if you know the index of the object you'd like to modify
let newArray = [
...arr
]
newArray[idx][key] = thing
// if you don't know the index
let newArray = [
...arr
]
newArray.map((el) => {
if (/* YOUR LOGIC HERE TO DETERMINE IF THIS IS THE OBJECT TO MODIFY! */) {
return el[key] = thing
} else {
return el
}
})
// if you want it done in one function...
let newArray = []
arr.map((el) => {
if (el[key]) {
newArray.push(Object.assign({}, { [key]: thing }))
return el
} else {
newArray.push(Object.assign({}, el))
return el
}
})