Например, если у меня есть два объекта:
var foo = {
x: "bar",
y: "baz"
}
и
var oof = {}
и я хотел перенести значения x и y из foo в oof. Есть ли способ сделать это с помощью синтаксиса деструктуризации es6?
возможно что-то вроде:
oof{x,y} = foo
javascript
ecmascript-6
destructuring
majorBummer
источник
источник
Object.assign(oof, foo)
Object.assign
Ответы:
Уродливый и немного повторяющийся, вы можете сделать
который будет читать два значения
foo
объекта и записывать их в соответствующие места наoof
объекте.Лично я бы предпочел прочитать
или
хотя.
источник
var oof = {};
.({x: oof.x, y: oof.y} = foo)
? Я думаю , что вы положили дополнительный п в OOF .Нет, деструктуризация не поддерживает выражения членов в сокращенном виде, а только простые имена свойств в настоящее время. Об этом уже говорили на esdiscuss, но никаких предложений в ES6 не будет.
Однако вы можете использовать
Object.assign
- если вам не нужны все собственные свойства, вы все равно можете сделатьисточник
--harmony_destructuring
включенным. Я вижу «SyntaxError: неожиданный токен».{oof.x, oof.y} = foo
. Или, может быть, я действительно это пропустил.ИМО, это самый простой способ выполнить то, что вы ищете:
По сути, деструктурируйте в переменные, а затем используйте сокращение инициализатора для создания нового объекта. Нет необходимости в
Object.assign
В любом случае, я думаю, что это наиболее читаемый способ. Таким образом, вы можете выбрать именно тот реквизит,
someObject
который вам нужен. Если у вас есть существующий объект, в который вы просто хотите объединить реквизиты, сделайте что-то вроде этого:Другой, возможно, более чистый способ его написания:
Я часто использую это для
POST
запросов, когда мне нужно всего несколько фрагментов дискретных данных. Но я согласен, что для этого должен быть один лайнер.РЕДАКТИРОВАТЬ: PS - Недавно я узнал, что вы можете использовать ультра-деструктуризацию на первом этапе, чтобы вытащить вложенные значения из сложных объектов! Например...
Кроме того, вы можете использовать оператор распространения вместо Object.assign при создании нового объекта:
Или...
источник
Кроме
Object.assign
есть объект распространения синтаксис , который является 2 -й этап предложение по ECMAScript.Но чтобы использовать эту функцию, вам нужно использовать
stage-2
илиtransform-object-rest-spread
плагин для babel. Вот демо на Babel сstage-2
источник
Плагин BabelJS
Если вы используете BabelJS , теперь вы можете активировать мой плагин
babel-plugin-transform-object-from-destructuring
( см. Пакет npm для установки и использования ).У меня была такая же проблема, описанная в этом потоке, и для меня было очень утомительно, когда вы создавали объект из выражения деструктуризации, особенно когда вам нужно переименовать, добавить или удалить свойство. С этим плагином вам будет намного проще поддерживать такие сценарии.
Пример объекта
можно записать как:
Пример массива
можно записать как:
источник
let myTest = { test1, test3 } = myObject;
не работаетВполне возможно. Только не в одном заявлении.
(Обратите внимание на круглые скобки вокруг утверждения.) Но имейте в виду, что удобочитаемость важнее, чем игра в код :).
Источник: http://exploringjs.com/es6/ch_destructuring.html#sec_assignment-targets
источник
Для этого можно просто использовать реструктуризацию:
Или объедините оба объекта, если oof имеет значения:
источник
oof = {...oof, ...foo}
Вы можете вернуть деструктурированный объект в стрелочной функции и использовать Object.assign (), чтобы присвоить его переменной.
источник
DRY
или
источник
Вы можете разрушить объект, назначив его непосредственно другому атрибуту объекта.
Рабочий пример:
Вы можете работать с деструкцией, используя переменные с тем же именем атрибута объекта, который вы хотите поймать, таким образом вам не нужно:
Используйте этот способ:
Таким же образом вы можете установить новые значения для структур объектов, если они имеют одинаковое имя атрибута.
Посмотрите этот рабочий пример:
источник
Это работает в Chrome 53.0.2785.89
источник
oof
просто получает ссылкуfoo
и обходит всю деструктуризацию (по крайней мере, в Chrome).oof === foo
иlet oof = { x } = foo
все же возвращается{ x, y }
Я придумал такой метод:
Что вы можете использовать так:
то есть, вы можете выбрать, какие свойства вы хотите получить, и поместить их в новый объект. В отличие от них
_.pick
вы также можете переименовать их одновременно.Если вы хотите скопировать реквизиты на существующий объект, просто установите
dest
arg.источник
Это вроде жульничества, но можно и так ...
На практике, я думаю, вы вряд ли захотите это использовать. Следующее - НАМНОГО яснее ... но не так весело.
Еще один совершенно другой маршрут, который включает в себя работу с прототипом (осторожно ...):
источник
Это самое удобочитаемое и кратчайшее решение, которое я мог придумать:
Он выведет
{ isValidDate: 'yes' }
Было бы неплохо когда-нибудь сказать что-то подобное,
let newProps = ({ isValidDate } = props)
но, к сожалению, это не то, что поддерживает ES6.источник
Это не красивый способ, и я рекомендую его, но это возможно, просто для знаний.
источник
Вы можете использовать методы класса JSON для достижения этого следующим образом
Передайте свойства, которые необходимо добавить к результирующему объекту, в качестве второго аргумента
stringify
функции в формате массива.Документ MDN для JSON.stringify
источник