标签: destructuring

在数组内构造所有元素的对象属性

在最基本的形式中,拥有一个对象数组:

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运算符的正确语法是什么?(很确定我已经在这里混淆了一些定义).似乎后者不受支持,但我没有遇到任何文件(以及为什么)它不会.

javascript destructuring

10
推荐指数
2
解决办法
6943
查看次数

ES6 - 如何使用字符串键从对象中进行结构化?

我有一个对象

{
  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)

因为这会给出错误.

当其中一个键是字符串时,如何构造对象的属性?

javascript destructuring ecmascript-6

10
推荐指数
1
解决办法
2430
查看次数

使用`this`进行ES6解构分配

以下代码有效.有没有一种更方便的方式,如果可能的话甚至是一个单行程?

const { nextUrl, posts } = await postService.getCommunityPosts(6);
this.communityPosts = posts;
this.nextUrl = nextUrl;
Run Code Online (Sandbox Code Playgroud)

我知道给出了结构化属性别名,但我不认为在这种情况下有帮助.MDN对此案没有任何说明.

javascript destructuring variable-assignment ecmascript-6

10
推荐指数
2
解决办法
2160
查看次数

循环变量前的`&` 的目的是什么?

&代码中的目的是什么&i in list?如果我删除&,则会在 中产生错误largest = i,因为它们的类型不匹配(其中iis&32iis i32)。但是如何&i转换ii32

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)

reference pattern-matching destructuring ampersand rust

10
推荐指数
2
解决办法
1349
查看次数

将对象解构为数组

我有这个对象

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)

javascript destructuring

10
推荐指数
1
解决办法
9164
查看次数

为什么 JS 解构赋值对数字起作用

正如标题所说,为什么这段代码不抛出 SyntaxError?我以为你只能解构对象

const {
  a,
  b
} = 0;

console.log(a, b); // undefined, undefined
Run Code Online (Sandbox Code Playgroud)

javascript language-features destructuring

10
推荐指数
1
解决办法
65
查看次数

使用“has”声明符进行解构/列表赋值

[我同时遇到了引发这个问题和上一个问题的问题,但我认为这两个问题应该分开。]

\n

该文档描述了使用和变量进行解构赋值,但没有提及它是否可以与变量一起使用。但 Raku 足够一致,我决定尝试一下,而且它似乎有效:myourhas

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

然而,这种形式似乎打破了属性默认值:

\n
class 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)

constructor destructuring variable-assignment rakudo raku

10
推荐指数
1
解决办法
111
查看次数

*为什么*列表赋值会使其左侧变平?

我知道列表赋值会使其左侧变平:

\n
my ($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\n
Run Code Online (Sandbox Code Playgroud)\n

我也明白我们可以用来:($a, ($b, $c)) := (0, (1.0, 1.1))获得非扁平化行为。

\n

我不明白的是为什么在列表分配期间左侧被展平。这是两个问题:首先,这种扁平化行为如何与语言的其余部分相适应?其次,自动展平是否允许任何在左侧不展平时不可能出现的行为?

\n

关于第一个问题,我知道 Raku 历史上有很多自动扁平化行为。在Great List Refactor之前,像这样的表达式my @a = 1, (2, 3), 4会自动展平其右侧,从而产生 Array [1, 2, 3, 4];同样,map许多其他迭代结构也会使他们的论点变得扁平化。不过,在 …

destructuring variable-assignment flatten assignment-operator raku

10
推荐指数
1
解决办法
172
查看次数

es6 {[a]:b}解构意味着什么?

这里有一些解构:

const { [a]: b } = this.props
Run Code Online (Sandbox Code Playgroud)

但是,做了[a]: b什么:带冒号的括号是做什么的?在我的情况下,a作为一个带有字符串值的道具提供.

javascript destructuring ecmascript-6 reactjs

9
推荐指数
1
解决办法
142
查看次数

数组解构跳过值

我的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)

javascript arrays destructuring airbnb-js-styleguide

9
推荐指数
2
解决办法
219
查看次数