Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在数组中为所有元素分解对象属性_Javascript_Destructuring - Fatal编程技术网

Javascript 在数组中为所有元素分解对象属性

Javascript 在数组中为所有元素分解对象属性,javascript,destructuring,Javascript,Destructuring,以其最基本的形式,具有对象数组: 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; //undef

以其最基本的形式,具有对象数组:

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
让[{val}:…res]=arr生成语法错误

使用其他方法很容易,例如在数组上使用
map
,但我在分解多个级别(具有包含数组的自身属性的对象的数组)时,通常会遇到这个问题。因此,我真的在试着绕开如何仅通过解构来实现它。 为方便起见:

编辑

如果我未能解释问题的目的,我深表歉意。我不是在寻找一个特定问题的解决方案,只是为了找到解构时要使用的正确语法


否则,第一个问题是:在上面的例子中,为什么不
让[…{val:res}]=arr返回所有值(
['a','b']
)。第二个问题是:使用rest操作符进行嵌套对象分解的正确语法是什么?(我很确定我在这里混淆了一些定义)。后者似乎不受支持,但我还没有看到任何文档(以及为什么)不受支持。

您可以像这样分解嵌套对象

让arr=[
{val:“a”},
{val:“b”}
];
常量[{val:valueOfA},{val:valueOfB}]=arr
console.log(
价值A,价值B

)
在带有回调值的映射旁边

让arr=[{val:a},{val:b}];
log(arr.map(o=>o.val))
为什么不让[…{val:res}]=arr返回所有值(
['a','b']

您似乎混淆了rest语法和数组理解

如果将值分配给
[someElements,…someExpression]
,则测试该值是否可编辑,然后将迭代器生成的每个元素分配给相应的
someElements
变量。如果在解构表达式中使用rest语法,则将创建一个数组,并在使用生成的值填充数组的同时运行迭代器直到其结束。然后将该数组分配给
someExpression

所有这些赋值目标都可以是其他非结构化表达式(任意嵌套和递归计算),也可以是对变量或属性的引用

因此,如果您使用
让[…{val:res}]=arr
,它将创建一个数组,并使用
arr
的迭代器中的所有值填充该数组:

let {val:res} = Array.from(arr[Symbol.iterator]())
现在,您可以看到为什么这会导致
未定义
,以及为什么使用类似
[…{length:res}]
的方法会产生结果。另一个例子:

let [{val:res1}, ...{length: res2}] = arr;
console.log(res1) // 'a'
console.log(res2) // 1 (length of `[{val: 'b'}]`)
如何使用解构仅获取值
['a','b']


一点也不。使用
map
方法。

您可以在分解分配之前声明分配目标;在解构目标处,设置来自解构源的目标索引的赋值

让arr1=[{val:a},{val:b}];
设arr2=[{“foo”:1,“arr”:[{“val”:“a”},{“val”:“b”}
,{“foo”:2,“arr”:[{“val”:“c”},{“val”:“d”}];
让[res1,res2]=[[],[];
[{val:res1[0]},{val:res1[1]}]=arr1;
[{arr:[{val:res2[0]},{val:res2[1]}]
,{arr:[{val:res2[2]},{val:res2[3]}]}=arr2;

console.log(res1、res2)此时,您可以将两者都用于

让arr=[{val:a},{val:b}];
用于(arr中的常数项){
const{val}=arr[项目];
控制台日志(val);

}
谢谢您的回答。我知道
map
可以使用,我也可以使用
for({val:v}of arr)console.log(v)
将析构函数和循环结合起来,甚至在
map
中使用析构函数,但是如果rest操作符可以用于对象本身,并且析构函数可以用于嵌套属性,为什么rest操作符不能用于对象析构函数?我找不到关于它的支持的文档,但也找不到关于它不被支持的文档。实际上我完全不正确。您可以一次对嵌套的ObjectSearch元素进行解构(这确实是可能的),但是对于未知数量的条目,您将如何进行同样的解构?(不计算
的..of
)@Me.Name“(不计算..of)”为什么不能使用
的..of?什么是需求?
for…of
是一个迭代器循环,变量在每次迭代中声明,不同于
for…in
for
loopHi Nina。谢谢你回复我的帖子。我一直很喜欢你的帖子和你提供的简洁的答案:)但是在这种情况下,这不是关于具体的场景,而是为了找到一个通用的语法解决方案。我认为对于未知数量的元素,会有一种语法来执行相同的析构函数,因此同样的语法可以用于
[{foo:1,arr:[{val:“a”},{val:“b”},{foo:2,arr:[{val:“c”},{val:“d”}]}]
我的误读就是你想要达到的结果。我(非常)依赖于例子,对我来说,不清楚你想要实现什么。我看不出这个对象是源对象还是目标对象。如果包含源和目标,也许itz会更清楚。目标是找出如何(以及是否)使用分解来获得这样的多个值。由于
rest
运算符存在(
let[…res]=arr;
有效),并且嵌套的属性都是