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
4

4 回答 4

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;
}
于 2015-11-26T01:52:16.100 回答
1

你说你想使用解构......所以让我们这样做:

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

但实际上,避免这种情况,而是使用清晰易读的属性分配:-)

于 2015-11-26T02:32:24.340 回答
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;
于 2015-11-26T01:56:22.803 回答
1

由于您不喜欢 Barmar 的回答,您可以使用组合Object.keys和结果数组的reduce方法:

let customer = Object.keys(formData).reduce(function(acc, key) {
    acc[key] = formData[key].val;
    return acc;
}, {});
于 2015-11-26T01:57:07.207 回答