2016-02-02 3 views
4

Я пытаюсь деконструировать объект и применять переменные, выведенные в его собственный объект.ES2015, деконструирующийся в объект

например. Объект beforeTest содержит a, b, c, d

Я хочу взять {a, b} и добавить его к объекту afterTest.

Что-то вроде ...

let afterTest = { a, b } = beforeTest 

следующие работы, но это не очень красиво, когда у вас есть много переменных.

let { a, b } = beforeTest; 
let afterTest = Object.assign({}, a, b); //EDIT: This doesn't actually do what I intended, see comment on my question 

Кто-нибудь знает о более удобном способе написать это?

Благодаря

+0

'Object.assign ({}, a b)' недействителен. Вы хотите, чтобы 'afterTest' содержал свойства' a' и 'b' или содержал свойства' a' и 'b' с теми же значениями, что и' beforeTest'? – ssube

+0

Да, просто возился и понимал, что не достигает того, чего я хочу. Последнее из того, что вы сказали, в основном для создания нового объекта с указанными парами ключ/значение. – Geraint

+0

К сожалению, вам придется повторять объявление переменной, а также создание объекта: 'let {a, b} = beforeTest; let afterTest = {... {a, b}}; ' – dfsq

ответ

2

деструктурирующие и объектные стенографий являются лучшими друзьями здесь.

Чтобы выбрать несколько свойств из объекта и создать новый объект с этим подмножеством, вы можете просто сделать:

let {a, b} = beforeTest; 
let afterTest = {a, b}; 

Это не имеет большого смысла, чтобы обеспечить синтаксис однострочный для этого, так как текущий синтаксис расширяется до нескольких источников/стоков довольно легко:

let {a1, b1} = beforeTest; 
let {a2, b2} = midTest; 
let aN = {a1, a2}, bN = {b1, b2}; 

Вы можете получить эту работу в одной строке, если ваш источник (ы) не имеют повторяющиеся свойства (то есть, только один из источника 1 и 2 имеют поле a), используя карту (pluck) и уменьшить:

let beforeTest = {a: 1, b: 2, c: 3}; 
let midTest = {d: 4, e: 5, f: 6}; 

let fields = ['a', 'c', 'd']; 
let afterTest = Object.assign.apply({}, [beforeTest, midTest].map(obj => { 
    return Object.keys(obj).filter(key => fields.includes(key)).reduce((p, key) => (p[key] = obj[key], p), {}); 
})); 

console.log(afterTest); 

Я не думаю, что последний метод стоит того, потому что он довольно непрозрачен относительно того, откуда поступают данные.

Смежные вопросы