【问题标题】:Iterate over JavaScript object with index使用索引遍历 JavaScript 对象
【发布时间】:2017-12-28 07:53:13
【问题描述】:

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

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

它工作正常,虽然当我尝试使用 index 获取第一项时,它在控制台中返回错误:

Uncaught TypeError: Invalid attempt to destructure non-iterable instance

关于如何循环使用索引的对象有什么想法吗?谢谢

【问题讨论】:

  • 您是否意识到属性没有特定的顺序,因此索引对于对象的属性真的没有任何意义?我怀疑这只是做任何你想做的事情的错误方法。您可以使用Object.keys() 获取属性名称数组,然后对其进行迭代,然后会有一个索引,但同样,它可能没有意义。
  • 感谢您的洞察力。如果我需要获取第一项,我会尝试将对象更改为听起来更合乎逻辑的数组。
  • 是的,数组更有意义,然后您的 for/of 循环将按您的意愿工作。
  • 你的object 是什么?请发布引发此错误的整个代码(它表明您的 object 是可迭代的,但元素不是)。

标签: javascript for-loop ecmascript-6


【解决方案1】:

简单计算索引:

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)=> /*...*/);

【讨论】:

  • 您好乔纳斯,感谢您的回答。但我希望在 ES6 中有一种更干净、更整洁的方法。
  • @londonfed shure 有几种方法。
  • 好吧,一个简单的 forEach 听起来是最好的方法。再次感谢
【解决方案2】:

这只是对 jonas w 解决方案的补充。

如果需要当前值的key:

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}`);
});

【讨论】:

    猜你喜欢
    • 2023-02-10
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多