Check inside a loop that array has next element in Javascript/QML
Solution 1
If you want to loop through every element except the last one (which doesn't have an element after it), you should do as suggested:
for(var i = 0; i < items.length-1; ++i) {
// items[i+1] will always exist inside this loop
}
If, however, you want to loop through every element -even the last one-, and just add a condition if there is an element after, just move that same condition inside your loop:
for(var i = 0; i < items.length; ++i) {
// do stuff on every element
if(i < items.length-1){
// items[i+1] will always exist inside this condition
}
}
if(items[i+1])
will return false (and not execute the condition) if the next element contains a falsey value like false
, 0
, ""
(an empty String returns false
).
Solution 2
Put a value check on variable i
and make sure it is less than items.length-1
in order to safely access items[i+1]
.
for(var i = 0; i < items.length-1; ++i) {
if(items[i+1]) {
//do stuff
}
}
Solution 3
Drop the for
loop and use array#forEach
, and simply check whether a next value exists:
items.forEach(function (item, index) {
if (!items[index + 1]) return;
// do something with item and items[index + 1]
});
Related videos on Youtube
EMBEDONIX
Protecting yourself against thrown exceptions, considered as a defensive programming practice.
Updated on October 09, 2022Comments
-
EMBEDONIX over 1 year
I have an array
items
. I need to make sure that in the current iteration of the loop I can safely call the next item of the arrayfor(var i = 0; i < items.length; ++i) { // do some stuff with current index e.g.... item = items[i]; // then do something with item @ i+1 if(items[i+1]) { //do stuff } }
Is this how it is done or if not how/what would be the better way?
P.S. I do not want to do a bound check
-
blex almost 9 yearsThe best way would be to replace
i < items.length
withi < items.length-1
. Then, you can safely callitems[i+1]
inside your loop. -
user229044 almost 9 years@blex That should be an answer
-
-
Andres Felipe over 3 yearsActually, i needed to break the loop between an if and an else, your answer helps a lot because one can't break array.forEach in a goog way like the old fashion loop for does