在最基本的形式中,拥有一个对象数组:
let arr = [
{val:"a"},
{val:"b"}
];
Run Code Online (Sandbox Code Playgroud)
如何使用解构,只获得价值['a', 'b'].
获得第一个值很容易:
let [{val:res}] = arr; //res contains 'a'
Run Code Online (Sandbox Code Playgroud)
获取数组内的所有值可以使用rest运算符完成:
let [...res] = arr; //res contains all objects
Run Code Online (Sandbox Code Playgroud)
结合这些,我希望能够使用:
let [...{val:res}] = arr; //undefined, expected all 'val's (['a', 'b'])
Run Code Online (Sandbox Code Playgroud)
以上返回undefined(在FF中测试).一些进一步的测试似乎表明,在使用对象解构时添加rest运算符也不使用迭代,而是返回原始对象,例如let [...{length:res}] = arr; //res= 2.其他一些试验,例如let [{val:...res}] = arr;或let [{val}:...res] = arr;产生语法错误.
使用其他方法很容易,例如map在数组上使用,但大多数情况下我在解析多个级别(一个包含自己的属性包含数组的对象的数组)时会偶然发现这个问题.因此,我真的想通过解构来解决如何做到这一点.为方便起见:一个测试小提琴
编辑
如果我没有解释问题的目标,我表示歉意.我不是在寻找特定问题的解决方案,只是为了找到在解构时使用的正确语法.
否则制定,第一个问题是:在上面的例子中,为什么不let [...{val:res}] = arr;返回所有值(['a', 'b']).第二个问题是:使用具有嵌套对象解构的rest运算符的正确语法是什么?(很确定我已经在这里混淆了一些定义).似乎后者不受支持,但我没有遇到任何文件(以及为什么)它不会.
我有一个对象
{
hello_en: 'hello world',
'hello_zh-CN': '????',
something: 'nice day',
something_else: 'isn\'t it'
}
Run Code Online (Sandbox Code Playgroud)
传递给一个函数
function(data) {
const { hello_en, hello_zh-CN, ...rest } = data
// do some stuff with hello_en and hello_zh-CN
// so some other stuff with rest
}
Run Code Online (Sandbox Code Playgroud)
但当然hello_zh-CN不是有效的关键名称.
我无法写
const { hello_en, 'hello_zh-CN', ...rest } = data
Run Code Online (Sandbox Code Playgroud)
因为这会给出错误.
当其中一个键是字符串时,如何构造对象的属性?
以下代码有效.有没有一种更方便的方式,如果可能的话甚至是一个单行程?
const { nextUrl, posts } = await postService.getCommunityPosts(6);
this.communityPosts = posts;
this.nextUrl = nextUrl;
Run Code Online (Sandbox Code Playgroud)
我知道给出了结构化属性别名,但我不认为在这种情况下有帮助.MDN对此案没有任何说明.
&代码中的目的是什么&i in list?如果我删除&,则会在 中产生错误largest = i,因为它们的类型不匹配(其中iis&32和iis i32)。但是如何&i转换i为i32?
fn largest(list: &[i32]) -> i32 {
println!("{:?}", list);
let mut largest = list[0];
for &i in list {
if i > largest {
largest = i;
}
}
largest
}
fn main() {
let hey = vec![1, 3, 2, 6, 90, 67, 788, 12, 34, 54, 32];
println!("The largest number is: {}", largest(&hey)); …Run Code Online (Sandbox Code Playgroud) 我有这个对象
const foo = {
a: 'kitten',
b: 'puppy',
c: 'lion'
};
Run Code Online (Sandbox Code Playgroud)
将其解构为变量就像这样
const { a, b, c } = foo;
Run Code Online (Sandbox Code Playgroud)
是否有一个简单的方法如何将其解构为数组,以便结果是
const array = [a, b, c];
Run Code Online (Sandbox Code Playgroud) 正如标题所说,为什么这段代码不抛出 SyntaxError?我以为你只能解构对象
const {
a,
b
} = 0;
console.log(a, b); // undefined, undefinedRun Code Online (Sandbox Code Playgroud)
[我同时遇到了引发这个问题和上一个问题的问题,但我认为这两个问题应该分开。]
\n该文档描述了使用和变量进行解构赋值,但没有提及它是否可以与变量一起使用。但 Raku 足够一致,我决定尝试一下,而且它似乎有效:myourhas
class C { has $.a; has $.b }\nclass D { has ($.a, $.b) }\nC.new: :a<foo>; # OUTPUT: \xc2\xabC.new(a => "foo", b => Any)\xc2\xbb\nD.new: :a<foo>; # OUTPUT: \xc2\xabD.new(a => "foo", b => Any)\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n然而,这种形式似乎打破了属性默认值:
\nclass C { has $.a; has $.b = 42 }\nclass D { has ($.a, $.b = 42) }\nC.new: :a<foo>; # OUTPUT: \xc2\xabC.new(a => "foo", b => 42)\xc2\xbb\nD.new: :a<foo>; # OUTPUT: \xc2\xabC.new(a …Run Code Online (Sandbox Code Playgroud) 我知道列表赋值会使其左侧变平:
\nmy ($a, $b, $c);\n($a, ($b, $c)) = (0, (1.0, 1.1), 2);\nsay "\\$a: $a"; # OUTPUT: \xc2\xab$a: 0\xc2\xbb\nsay "\\$b: $b"; # OUTPUT: \xc2\xab$b: 1 1.1\xc2\xbb <-- $b is *not* 1\nsay "\\$c: $c"; # OUTPUT: \xc2\xab$c: 2\xc2\xbb <-- $c is *not* 1.1\nRun Code Online (Sandbox Code Playgroud)\n我也明白我们可以用来:($a, ($b, $c)) := (0, (1.0, 1.1))获得非扁平化行为。
我不明白的是为什么在列表分配期间左侧被展平。这是两个问题:首先,这种扁平化行为如何与语言的其余部分相适应?其次,自动展平是否允许任何在左侧不展平时不可能出现的行为?
\n关于第一个问题,我知道 Raku 历史上有很多自动扁平化行为。在Great List Refactor之前,像这样的表达式my @a = 1, (2, 3), 4会自动展平其右侧,从而产生 Array [1, 2, 3, 4];同样,map许多其他迭代结构也会使他们的论点变得扁平化。不过,在 …
destructuring variable-assignment flatten assignment-operator raku
这里有一些解构:
const { [a]: b } = this.props
Run Code Online (Sandbox Code Playgroud)
但是,做了[a]: b什么:带冒号的括号是做什么的?在我的情况下,a作为一个带有字符串值的道具提供.
我的airbnb 风格指南告诉我我应该在下面的任务中使用数组解构。
const splittedArr = [1, 2, 3, 4, 5]
const result = splittedArr[1];
Run Code Online (Sandbox Code Playgroud)
所以我使用 skipping values 像这样编写它,以获得第二个元素。
const splittedArr = [1, 2, 3, 4, 5]
const [, result] = splittedArr;
Run Code Online (Sandbox Code Playgroud)
const splittedArr = [1, 2, 3, 4, 5]
const result = splittedArr[1];
Run Code Online (Sandbox Code Playgroud)
但是例如当我有一个更高的指数要破坏时
const splittedArr = [1, 2, 3, 4, 5]
const result = splittedArr[5];
Run Code Online (Sandbox Code Playgroud)
这意味着我必须像这样写
const splittedArr = [1, 2, 3, 4, 5]
const [,,,, result] = splittedArr;
Run Code Online (Sandbox Code Playgroud)
const splittedArr = …Run Code Online (Sandbox Code Playgroud)destructuring ×10
javascript ×7
ecmascript-6 ×3
raku ×2
ampersand ×1
arrays ×1
constructor ×1
flatten ×1
rakudo ×1
reactjs ×1
reference ×1
rust ×1