for ...使用数组

时间:2017-09-23 22:56:12

标签: javascript ecmascript-6 destructuring

根据Mozilla docs,这里是如何在for of循环中使用解构:

var people = [
  {
    name: 'Mike Smith',
    family: {
      mother: 'Jane Smith',
      father: 'Harry Smith',
      sister: 'Samantha Smith'
    },
    age: 35
  },
  {
    name: 'Tom Jones',
    family: {
      mother: 'Norah Jones',
      father: 'Richard Jones',
      brother: 'Howard Jones'
    },
    age: 25
  }
];

for (var {name: n, family: {father: f}} of people) {
  console.log('Name: ' + n + ', Father: ' + f);
}

// "Name: Mike Smith, Father: Harry Smith"
// "Name: Tom Jones, Father: Richard Jones"

我的问题是,如果family对象位于数组中,正确的解构语法是什么,如下所示:

var people = [
  {
    name: 'Tom Jones',
    family: [
     {
      mother: 'Norah Jones',
      father: 'Richard Jones',
      brother: 'Howard Jones'
     }
    ],
    age: 25
  }
];

(注意额外的[方括号])

尝试使用:

进行结构化
for (var {name: n, family[0]: {father: f}} of people) {
  console.log('Name: ' + n + ', Father: ' + f);
}

在方括号处出现Unexpected token错误。

因此,在此示例中,如何使用解构将值分配给f

2 个答案:

答案 0 :(得分:10)

您希望表示数组结构,而不是数组索引访问。

var people = [{
  name: 'Tom Jones',
  family: [{
    mother: 'Norah Jones',
    father: 'Richard Jones',
    brother: 'Howard Jones'
  }],
  age: 25
}];

// Describe the structure -v-----------v
for (var {name: n, family: [{father: f}]} of people) {
  console.log('Name: ' + n + ', Father: ' + f);
}

当然,这假设您只想要第一个成员。如果您需要更多,可以使用其余语法。

var people = [{
  name: 'Tom Jones',
  family: [{
    mother: 'Norah Jones',
    father: 'Richard Jones',
    brother: 'Howard Jones'
  }],
  age: 25
}];

for (var {name: n, family: [{father: f}, ...rem]} of people) {
  console.log('Name: ' + n + ', Father: ' + f);
  console.log("Remaining values: %s", rem.length);
}

答案 1 :(得分:2)

您可以使用数组解构(简单地忽略任何剩余的数组元素):

                        // vv            vv
for (var {name: n, family: [ {father: f} ] } of people)
  // ...

或者,由于数组只是对象,因此可以使用对象解构和索引作为键:

                        // vvvvv            vv
for (var {name: n, family: { 0: {father: f} } } of people)
  // ...