Разрушение объекта Javascript с именем свойства в переменной

#javascript #destructuring

#javascript #деструктурирование

Вопрос:

Возможно ли деструктурировать объект в Javascript, используя имя свойства, хранящееся в переменной?

Вот как мы сейчас разрушаем.

 const myObject = {a: 1, b: 2, c: 3};
let {a, b, c} = myObject;
console.log(a, b, c);
  

Я хотел бы иметь возможность хранить имена свойств в переменных:

 const myObject = {banana: 1, apple: 2, strawberry: 3};
const chosenFruit = "banana";
const { [[chosenFruit]], ...theRest } = myObject;
console.log(banana); // Should be 1
  

Для полного раскрытия причина, по которой я хочу иметь возможность это сделать, заключается в том, что я хочу удалить свойство «банан» из объекта. Итак, в моем случае я хочу, чтобы меня оставили с theRest объектом, который не включает banana свойство, но были случаи, когда я хотел перебирать массив значений (например, дни недели) и программно быстро разрушать объекты.

Возможно ли это? Если да, то как?

Спасибо!

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

1. delete myObject.banana; <= готово

2. @Taplar ты имеешь в виду delete myObject[choosenFruit]

3. Вы сказали, что вашей целью было удалить banana из объекта.

4. Вам нужно что-то вроде const { [chosenFruit]: banana, ...theRest } = myObject; ? однако вам придется явно ввести banana деструктурирование

5. Таким образом, вы можете клонировать его, а затем удалить

Ответ №1:

Вы можете взять вычисленные имена свойств и переименовать свойство (присвоив новые имена переменных).

 const myObject = { banana: 1, apple: 2, strawberry: 3 };
const chosenFruit = "banana";
const { [chosenFruit]: fruit, ...theRest } = myObject;

console.log(fruit); // 1
console.log(theRest);  

Ответ №2:

 const myObject = {banana: 1, apple: 2, strawberry: 3};
const chosenFruit = "banana";
const newThing = { ...myObject };

delete newThing[chosenFruit];

console.log(myObject, newThing);  

Эта версия использует деконструкцию для клонирования, а затем удаляет ненужное свойство.

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

1. Хорошее решение! Достигается желаемый результат с удалением свойства, но не переводится в «обычное» деструктурирование, в отличие от ответа Нины. 🙂

2. «нормальная» деконструкция?

3. Где вы просто хотите извлекать значения из объектов, а не удалять их.

4. Ах, я понял. Верно.

5. Это не имеет никакого деструктурирования

Ответ №3:

Вариант с параметрами деструктурирования:

 const pick = (fruit, {[fruit]: out, ...fruits}) => [out, fruits];

const [fruit, fruits] = pick('banana', basket);

console.log(fruit);
console.log(fruits);
console.log(basket);  
 <script>const basket = { banana: 1, apple: 2, strawberry: 3 };</script>  

Ответ №4:

Это также работает для нединамических вариантов, а также если вы хотите, чтобы имя переменной совпадало с именем фрукта

 const myObject = { banana: 1, apple: 2, strawberry: 3 };
const { banana, ...theRest } = myObject;

console.log(banana); // 1
console.log(theRest);