【发布时间】:2017-02-25 10:17:23
【问题描述】:
在其最基本的形式中,有一个对象数组:
let arr = [
{val:"a"},
{val:"b"}
];
如何使用解构,只获取值['a', 'b']。
获取第一个值很容易:
let [{val:res}] = arr; //res contains 'a'
可以通过rest操作符来获取数组中的所有值:
let [...res] = arr; //res contains all objects
结合这些,我希望能够使用:
let [...{val:res}] = arr; //undefined, expected all 'val's (['a', 'b'])
以上返回未定义(在 FF 中测试)。一些进一步的测试似乎表明,在使用对象解构时添加 rest 运算符也不会使用迭代,而是取回原始对象,例如let [...{length:res}] = arr; //res= 2。其他一些试验,例如let [{val:...res}] = arr; 或let [{val}:...res] = arr; 会产生语法错误。
使用其他方法很容易,例如在数组上使用map,但大多数情况下,我在解构多个级别(具有包含数组的对象的数组)时偶然发现了这个问题。因此,我真的在尝试解决如何仅通过解构来做到这一点。
为方便起见:a test fiddle
编辑
如果我未能解释问题的目标,我深表歉意。我不是在寻找特定问题的解决方案,只是为了找到解构时使用的正确语法。
否则,第一个问题将是:在上面的示例中,为什么let [...{val:res}] = arr; 不返回所有值(['a', 'b'])。第二个问题是:在嵌套对象解构中使用 rest 运算符的正确语法是什么? (很确定我在这里混淆了一些定义)。似乎不支持后者,但我没有遇到任何不支持(以及为什么)不支持的文档。
【问题讨论】:
-
你希望
res在这样的解构过程中变成什么?什么是“所有 vals”? -
@Bergi 我原以为它会返回
['a', 'b'](它是let [{val:res}] = arr;和let [...res] = arr;的组合) -
@Me.Name "第二个问题是:在嵌套对象解构中使用 rest 运算符的正确语法是什么?(很确定我在这里混淆了一些定义)。” 见What is SpreadElement in ECMAScript documentation? Is it the same as Spread operator at MDN?
-
@Me.Name 是否要求不使用函数调用或循环?