Access to ES6 array element index inside for-of loop

JavascriptEcmascript 6For of-Loop

Javascript Problem Overview


We can access array elements using a for-of loop:

for (const j of [1, 2, 3, 4, 5]) {
  console.log(j);
}

How can I modify this code to access the current index too? I want to achieve this using for-of syntax, neither forEach nor for-in.

Javascript Solutions


Solution 1 - Javascript

Use Array.prototype.keys:

for (const index of [1, 2, 3, 4, 5].keys()) {
  console.log(index);
}

If you want to access both the key and the value, you can use Array.prototype.entries() with destructuring:

for (const [index, value] of [1, 2, 3, 4, 5].entries()) {
  console.log(index, value);
}

Solution 2 - Javascript

Array#entries returns the index and the value, if you need both:

for (let [index, value] of array.entries()) {

}

Solution 3 - Javascript

In this world of flashy new native functions, we sometimes forget the basics.

for (let i = 0; i < arr.length; i++) {
    console.log('index:', i, 'element:', arr[i]);
}

Clean, efficient, and you can still break the loop. Bonus! You can also start from the end and go backwards with i--!

Additional note: If you're using the value a lot within the loop, you may wish to do const value = arr[i]; at the top of the loop for an easy, readable reference.

Solution 4 - Javascript

In a for..of loop we can achieve this via array.entries(). array.entries returns a new Array iterator object. An iterator object knows how to access items from an iterable one at the time, while keeping track of its current position within that sequence.

When the next() method is called on the iterator key value pairs are generated. In these key value pairs the array index is the key and the array item is the value.

let arr = ['a', 'b', 'c'];
let iterator = arr.entries();
console.log(iterator.next().value); // [0, 'a']
console.log(iterator.next().value); // [1, 'b']

A for..of loop is basically a construct which consumes an iterable and loops through all elements (using an iterator under the hood). We can combine this with array.entries() in the following manner:

array = ['a', 'b', 'c'];

for (let indexValue of array.entries()) {
  console.log(indexValue);
}


// we can use array destructuring to conveniently
// store the index and value in variables
for (let [index, value] of array.entries()) {
   console.log(index, value);
}

Solution 5 - Javascript

You can also handle index yourself if You need the index, it will not work if You need the key.

let i = 0;
for (const item of iterableItems) {
  // do something with index
  console.log(i);

  i++;
}

Solution 6 - Javascript

in html/js context, on modern browsers, with other iterable objects than Arrays we could also use [Iterable].entries():

for(let [index, element] of document.querySelectorAll('div').entries()) {

    element.innerHTML = '#' + index

}

Solution 7 - Javascript

Another approach could be using Array.prototype.forEach() as

Array.from({
  length: 5
}, () => Math.floor(Math.random() * 5)).forEach((val, index) => {
  console.log(val, index)
})

Solution 8 - Javascript

Just create a variable before the loop and assign an integer value.

let index = 0;

and then use addition assignment operator into the loop scope

index += 1;

That's It, check the below snippet example.

let index = 0;
for (const j of [1, 2, 3, 4, 5]) {
  index += 1;
  console.log('index ',index);
}

Solution 9 - Javascript

For those using objects that are not an Array or even array-like, you can build your own iterable easily so you can still use for of for things like localStorage which really only have a length:

function indexerator(length) {
	var output = new Object();
	var index = 0;
	output[Symbol.iterator] = function() {
		return {next:function() {
			return (index < length) ? {value:index++} : {done:true};
		}};
	};
	return output;
}

Then just feed it a number:

for (let index of indexerator(localStorage.length))
	console.log(localStorage.key(index))

Solution 10 - Javascript

es6 for...in

for(const index in [15, 64, 78]) {                        
    console.log(index);
}

Solution 11 - Javascript

Also you can use JavaScript to solve your problem

iterate(item, index) {
    console.log(`${item} has index ${index}`);
    //Do what you want...
}

readJsonList() {    
    jsonList.forEach(this.iterate);
    //it could be any array list.
}   

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAbdennour TOUMIView Question on Stackoverflow
Solution 1 - JavascriptMichał PerłakowskiView Answer on Stackoverflow
Solution 2 - JavascriptFelix KlingView Answer on Stackoverflow
Solution 3 - JavascriptchrisView Answer on Stackoverflow
Solution 4 - JavascriptWillem van der VeenView Answer on Stackoverflow
Solution 5 - JavascriptTintinSansYeuxView Answer on Stackoverflow
Solution 6 - JavascriptJoseph MerdrignacView Answer on Stackoverflow
Solution 7 - JavascriptSakshamView Answer on Stackoverflow
Solution 8 - JavascriptHidayt RahmanView Answer on Stackoverflow
Solution 9 - JavascriptHashbrownView Answer on Stackoverflow
Solution 10 - Javascriptsolanki...View Answer on Stackoverflow
Solution 11 - JavascriptIvan Nascimento FelicianoView Answer on Stackoverflow