Удаление атрибута из массива объектов по ключевой строке

У меня есть массив объектов, я хочу удалить несколько свойств этого объекта, вызвав функцию и передав массив и ключ, который я хочу удалить.

Я сослался на ответ это о переполнении стека, и он работает, когда я указываю ключ вручную, например id. Он удаляет свойство id каждого объекта в массиве.

const newArray = array.map(
            ({
                id,
                ...otherAttributes
            }) => otherAttributes
        );

Но когда я передаю ключ функции, а затем использую ключ из параметра, он не может обнаружить ключ в объекте и поэтому не может его удалить. Тело функции примерно такое:

removeKeyFromObjectsArray(newArray, key) {           
        const newArray = products.map(
            ({
                key,
                ...otherAttributes
            }) => otherAttributes
        );
        return newArray;

Я вызываю эту функцию с помощью this.removeKeyFromObjectsArray(this.updatedProducts, 'id'), но объекты внутри этого массива все еще имеют ключ. (this потому, что он находится внутри приложения Vue, и мне нужно обратиться к другой функции в том же экземпляре).

Эта функция работает, если мы вручную указываем имя ключа, например id, но она не работает, когда мы передаем строку ключа через параметр, а затем используем его, может ли кто-нибудь объяснить, в чем здесь проблема и как ее решить?

🤔 А знаете ли вы, что...
JavaScript можно использовать для создания анимаций и игр на веб-страницах.


1
69
2

Ответы:

Решено

Чтобы использовать имена вычисляемых свойств при деструктуризации, вам нужно обернуть key с [] и присвоить его новой переменной (в данном случае _). В противном случае он деструктурирует свойство с именем "key" из объекта, а не свойство с стоимость в переменной key

function removeKeyFromObjectsArray(products, key) {
    const newArray = products.map(
      ({
        [key]: _,
        ...otherAttributes
      }) => otherAttributes
    );
    return newArray;
}

console.info(
  removeKeyFromObjectsArray([{ id: 1, name: 'name1'},
                            { id: 2, name: 'name2'}], 'name')
)

Это удаление литерала key - используйте нотацию динамического свойства с квадратными скобками [], чтобы получить желаемый результат:

const newArray = products.map(({ [key]: _, ...otherAttributes }) => otherAttributes);

Причина, по которой я назначаю нежелательную клавишу _ выше, заключается в том, что принято использовать _ как «нежелательную» или «игнорировать эту» клавишу. Обратите внимание, что это отличается от префикс ключа с _ (_key), что означает «не изменяйте это напрямую - вместо этого используйте геттеры или сеттеры».