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