使用索引迭代JavaScript对象

41

我试图在ES6中循环遍历一个JavaScript对象。

 for (let [value, index] of object) {
    do something with rest
    if (index >= 1) {
       // do something with first item
    }
  }

它运行良好,尽管当我尝试使用索引来获取第一个项时,控制台会返回错误:

Uncaught TypeError: Invalid attempt to destructure non-iterable instance
任何遍历带索引对象的想法?谢谢。

Any ideas on how to loop over an object with index? thanks


5
你意识到对象的属性没有特定的顺序,因此索引对于对象属性的意义并不明确吗?我怀疑这只是你尝试做任何事情的错误方式。你可以使用Object.keys()来获取属性名称的数组,然后迭代它,那么就会有一个索引,尽管它可能并不具有实际意义。 - jfriend00
谢谢你的见解。如果我需要获取第一个项目,我会尝试将对象更改为数组,因为这听起来更合乎逻辑。 - londonfed
是的,使用数组更有意义,然后您的 for/of 循环将按照您的期望工作。 - jfriend00
你的“对象”是什么?请发布引发此错误的整个代码(它表明你的“对象”可迭代,但元素不是)。 - Bergi
5个回答

58

这只是对Jonas W解决方案的补充。

如果你需要当前值的键:

const object = {a:2, b:4, c:6, d:8};

for (const [index, [key, value]] of Object.entries(Object.entries(object))) {
  console.log(`${index}: ${key} = ${value}`);
}

Object.entries(object).forEach(([key, value], index) => {
  console.log(`${index}: ${key} = ${value}`);
});

当然,您可以随时省略key

const object = {a:2, b:4, c:6, d:8};

for (const [index, [, value]] of Object.entries(Object.entries(object))) {
  console.log(`${index}: ${value}`);
}

Object.entries(object).forEach(([, value], index) => {
  console.log(`${index}: ${value}`);
});


简单的方法来做。 - Perry

31

简单地计算索引:

let index = 0;
for (let value of object) {
  //do something with rest
  if (index >= 1) {
    // do something with the third and following items
  }
  index++;
}

或者如果你真的想使用对象解构(我不知道为什么),那就有点复杂:

let entries = Object.entries(object);

for(let [index, [key, value]] of entries.entries()){
 //...
}
或者:
for(let [index,value] of Object.values(object).entries()){
  //...
}

但我不知道为什么你不使用一个简单的forEach?:

Object.values(obj).forEach((value, index)=> /*...*/);

嗨Jonas,谢谢你的回答。但我希望在ES6中有一种更清晰、更整洁的方法来完成这个任务。 - londonfed
@londonfed 当然有几种方法。 - Jonas Wilms
1
好的,一个简单的forEach听起来是最好的选择。再次感谢。 - londonfed

5

index, key:

for (const [index, key] of Object.keys(object).entries()) {
  // ...
}

index, value:

for (const [index, value] of Object.values(object).entries()) {
  // ...
}

索引

for (const [index, [key, value]] of Object.entries(object).entries()) {
  // ...
}

2

只需计算索引:

let index = 0;
for (let value of object) {
  if (index === 1) {
    // do something with idx 1
  }
  // do something with the rest...
  index++;
}


0

只需使用:

const obj = {
  name: 'Bob',
  age: 23,
  city: 'Mexico',
};

for (const [key, value] of Object.entries(obj)) {
  console.log(key, '=>', value)
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接