Клонировать массив с оператором распространения и добавить встроенный

1

С помощью объекта я могу клонировать и добавлять:

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

Но я надеялся на более чистый синтаксис. Я не соглашусь, если нет подобного синтаксиса.

Теги:
ecmascript-next

2 ответа

1

Вы можете использовать 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);
  • 0
    @TrySpace Смотрите мой обновленный ответ.
0

Массивы не имеют ключей, поэтому синтаксис, который вы используете, не работает. Это массив объектов? Если так...

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
    }
})
  • 0
    Мне нужно получить доступ к индексу конкретного объекта в массиве и обновлять его только после того, как он был вставлен в новый массив.
  • 0
    @TrySpace, посмотрите, отвечает ли мой запрос вашим потребностям
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню