2015-11-26 6 views
0

Я пытаюсь быстро вытащить свойство «значение» из некоторых объектов, используя деструктурирование .. есть ли простой способ получить это от этого? Я думаю, что это возможно с помощью какой-то сложной деструктивной вещи, которую я не совсем понял.Вытягивание того же значения из ряда ключей

Я знаю, что могу использовать циклы и т. Д., Но я хотел бы сделать его немного более элегантным. Я ищу не-повторяющееся, идеально 1-2-строчное решение. Я хотел бы использовать карту, но это работает только на массиве ...

formData = { 
    name: {val: 'myName', key: 'value', etc: 'more data'} 
    province: {val: 'myProvince', key: 'value', etc: 'more data'} 
    dateOfBirth: {val: 'myBDAY!', key: 'value', etc: 'more data'} 
} 


//desired outcome: 
{ 
    name: 'myName', 
    province: 'myProvince', 
    dateOfBirth: 'myBDAY!' 
} 


//attempt 1 
let customer = { name, province, dateOfBirth} = formData; //hrm doesn't get me there 
+0

Где вы указываете, что он должен использовать свойство «val» каждого элемента при деструктурировании? – Barmar

+0

Если вы используете знак подчеркивания или lodash, тогда «выщипывайте» его. В качестве альтернативы 'Object.keys (formData) .reduce (function (acc, key) {acc [key] = formData [key] .val; return acc;}, {});' –

+0

@Barmar нигде .. это было плохо «попробуй», но я не мог придумать, как сделать это красиво. – Damon

ответ

2

деструктурирующих используются для назначения нескольких переменных из различных элементов массива или объекта, это не то, что вы делаете. Вы можете просто:

let customer = { 
    name: formData.name.val, 
    province: formData.province.val, 
    dateOfBirth: formData.dateOfBirth.val 
} 

Если вы не хотите явно указывать все свойства, просто используйте цикл.

let customer = {}; 
for (var k of Object.keys(formData)) { 
    customer[k] = formData[k].val; 
} 
+0

Это работает хорошо, но есть нежелательный (по крайней мере, меня) уровень повторения (фактический код имеет 8 свойств и является дополнительным уровнем глубокого) – Damon

+0

Тогда вы можете просто сделать цикл 'for-in'. – Barmar

+1

Поскольку это ES6, было бы гораздо безопаснее делать 'for (var k of Object.keys (formData)) {', чтобы избежать сбора перечислимых реквизитов в цепочке прототипов. – loganfsmyth

1

Твердого читать один вкладыш будет:

let customer = Object.keys(formData).reduce(
     (acc, key) => Object.assign(acc, {[key]: formData[key].val}), {}); 

, чтобы захватить .val от каждого значения в объекте, и возвращает новый объект с теми же ключами.

Это в основном эквивалент:

let customers = {}; 
for (const key of Object.keys(formData)) customers[key] = formData[key].val; 
1

Так что вам не нравится ответ Barmar, вы можете использовать комбинацию Object.keys и reduce метод получившегося массива:

let customer = Object.keys(formData).reduce(function(acc, key) { 
    acc[key] = formData[key].val; 
    return acc; 
}, {}); 
1

Вы сказали, что вам хотел использовать деструктурирование ... так что давайте сделаем это:

let customer = {}; 
for (let k in formData) ({[k]: {val: customer[k]}} = formData); 

Но на самом деле, избегайте этого и используйте вместо этого ясное и удобочитаемое присвоение свойств :-)

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