我试图通过使用解构来快速从某些对象中提取'value'属性..是否有一种简单的方法可以从中获取它?我认为通过一些复杂的解构可能有可能我还没有完全厌恶。
我知道我可以使用循环等,但我想让它更优雅一点。我正在寻找一种非重复的,理想的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 :(得分:2)
Destructuring用于从数组或对象的不同元素中分配多个变量,这不是您正在做的事情。你可以这样做:
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;
}
答案 1 :(得分: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;
答案 2 :(得分:1)
由于您不喜欢Barmar的答案,您可以使用Object.keys
和结果数组的reduce
方法的组合:
let customer = Object.keys(formData).reduce(function(acc, key) {
acc[key] = formData[key].val;
return acc;
}, {});
答案 3 :(得分:1)
你说你想要使用解构...所以让我们这样做:
let customer = {};
for (let k in formData) ({[k]: {val: customer[k]}} = formData);
但实际上,请避免这种情况,并使用清晰易读的属性赋值: - )