如何在for循环中解构嵌套对象

How to destructure nested objects in for-loop

var users = [
   { user: "Name1",geo:{lat:'12',long:'13'} },
   { user: "Name2",geo:{lat:'12',long:'13'}, age: 2 },
   { user: "Name2",geo:{lat:'12',long:'13'} },
   { user: "Name3",geo:{lat:'12',long:'13'}, age: 4 }
 ];

上面是对象数组。

这是 for-loop 我解构并获取用户和年龄,但我想要纬度和经度,我该怎么做?我希望它通过解构和 for-loop 就像我对 user 和 age

所做的那样
for (let { user, age = "DEFAULT AGE" } of users) {
  console.log(user, age);
}

如果您只是想找到给定的用户和 return 它的地理位置,这样做:

users.find( u => u.user === 'Name1' ).geo;

请记住,在尝试使用它之前,您需要对 'find result' 进行一些检查。例如:

const user = users.find( u => u.user === 'Name1' );

if (user && user.hasOwnProperty('geo')) {
    console.log(user.geo);
}

你可以使用这个:

for (let {user, age = "DEFAULT AGE", geo: {lat, long}} of users) {
  console.log(user, age, lat, long);
}

您已经成功解构了 user(仅通过对象中的 属性 名称)和 age(还有默认值)。

要逐步使用嵌套 destructuring,只需将 属性 名称 geo 也放在那里,因为那是对象上的下一个 属性正在迭代包含您需要的值:

{user, age = "DEFAULT AGE", geo} — 对于 geo.

这将产生 {lat: "12", long: "13"}

要直接访问嵌套属性,请遵循对象结构:

{user, age = "DEFAULT AGE", geo: {}} — 这只会验证geo确实是一个对象。

然后,列出您要在该对象中访问的属性:

{user, age = "DEFAULT AGE", geo: {lat, long}} — 这会产生 "12" for lat"13" for long.

您甚至可以更进一步 重命名 这些属性:

{user, age = "DEFAULT AGE", geo: {lat: latitude, long: longitude}} — 这将产生 "12" 对应 latitude"13" 对应 longitude.


这些是解构对象的基本情况:

  • name 表示“将整个值赋给 name”。
  • {} 表示“检查要解构的值是一个对象还是可以转换为一个对象,即既不是 null 也不是 undefined;不创建变量。
  • { prop }表示“获取prop的值作为变量prop”。
  • { prop: rename }表示“跟随prop属性并获取其值作为变量rename1.
  • { prop = value } 表示“获取 prop 的值作为变量 prop,但如果 prop 产生 undefined,则分配 value2.

对于“重命名”的情况,规则递归适用:rename 类似于 name,因此可以用 {},或 { anotherProp },或{ anotherProp: anotherRename },或{ anotherProp = anotherDefault },等等

同一对象级别的其他属性可以通过逗号添加,例如 {propA, propB}.

对于数组,存在类似的情况:[] 将验证要解构的值是一个 iterable 对象; [a, b]{0: a, 1: b}同义;等等


1:请注意,在 { prop: something } 的情况下,没有创建变量 prop

2:“yields undefined”意味着 obj.prop 将等于 undefined 这意味着 属性 存在并且具有字面值 undefined 或者 属性 不存在。