Reputation: 1230
I am trying to loop over a JavaScript object in ES6.
for (let [value, index] of object) {
do something with rest
if (index >= 1) {
// do something with first item
}
}
It works fine, although when I try to use index to get the first item it returns an error in console:
Uncaught TypeError: Invalid attempt to destructure non-iterable instance
Any ideas on how to loop over an object with index? thanks
Upvotes: 45
Views: 89057
Reputation: 11
Just use:
const obj = {
name: 'Bob',
age: 23,
city: 'Mexico',
};
for (const [key, value] of Object.entries(obj)) {
console.log(key, '=>', value)
}
Upvotes: 1
Reputation: 100
Just count the index:
let index = 0;
for (let value of object) {
if (index === 1) {
// do something with idx 1
}
// do something with the rest...
index++;
}
Upvotes: 2
Reputation: 1285
index
, key
:
for (const [index, key] of Object.keys(object).entries()) {
// ...
}
index
, value
:
for (const [index, value] of Object.values(object).entries()) {
// ...
}
index
, key
, value
:
for (const [index, [key, value]] of Object.entries(object).entries()) {
// ...
}
Upvotes: 12
Reputation: 138277
Simply count the index:
let index = 0;
for (let value of object) {
//do something with rest
if (index >= 1) {
// do something with the third and following items
}
index++;
}
Or if you really want to use object destructuring ( i dont know why ) its a bit more complicated:
let entries = Object.entries(object);
for(let [index, [key, value]] of entries.entries()){
//...
}
or:
for(let [index,value] of Object.values(object).entries()){
//...
}
But i dont know why youre not using a simple forEach?:
Object.values(obj).forEach((value, index)=> /*...*/);
Upvotes: 31
Reputation: 7285
This is just meant to be an addition to jonas w's solutions.
If you need the key of the current value:
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}`);
});
Of course, you can leave out the key
at any time:
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}`);
});
Upvotes: 66