'For in' does not recognize the elements in an array

2

I have the following problem with a 'for in' loop: it does not want to recognize the elements of the array. I tried to see the elements after calling the 'for in' with the console.log, but it returns 0.

function isValidWalk(walk) {
    console.log(walk.length);
    if (walk.length ===10) { 
        var WalkN=[]; 
        var WalkS=[];
        var WalkE=[];
        var WalkW=[];
        console.log(walk);
        for (var elemento in walk) { 
            console.log(elemento);
            console.log(walk);
            switch (elemento) { 
                case 'n':
                 WalkN.push(elemento);
                 break;
                case 's':
                 WalkS.push(elemento);
                 break;
                case 'e':
                 WalkE.push(elemento);
                 break;
                case 'w':
                 WalkW.push(elemento);
            }
        console.log( WalkN,WalkS,WalkE,WalkW);
         if (WalkN.length===WalkS.length && WalkE.length===WalkW.length) {
             return true
         }
         else { return false }
        }
    }
    else {
        return false 
    }
}
isValidWalk(['n','s','n','s','n','s','n','s','n','s'])
    
asked by Frnk 02.07.2018 в 20:48
source

3 answers

1

The easiest way to have what you want in a foreach cycle is to change the

in 

for a

of

so that it would be almost as it is.

function isValidWalk(walk) {
    console.log(walk.length);
    if (walk.length ===10) { 
        var WalkN=[]; 
        var WalkS=[];
        var WalkE=[];
        var WalkW=[];
        console.log(walk);
        for (var elemento of walk) { 
            console.log(elemento);
            console.log(walk);
            switch (elemento) { 
                case 'n':
                 WalkN.push(elemento);
                 break;
                case 's':
                 WalkS.push(elemento);
                 break;
                case 'e':
                 WalkE.push(elemento);
                 break;
                case 'w':
                 WalkW.push(elemento);
            }
        console.log( WalkN,WalkS,WalkE,WalkW);
         if (WalkN.length===WalkS.length && WalkE.length===WalkW.length) {
             return true
         }
         else { return false }
        }
    }
    else {
        return false 
    }
}
isValidWalk(['n','s','n','s','n','s','n','s','n','s'])

that way you can access the contents of the array and not the index.

    
answered by 03.07.2018 / 01:35
source
2

The problem is that for..in is not designed for arrays but for objects. To object to the result you want, it is better to use forEach like this:

function isValidWalk(walk) {
    console.log(walk.length);
    if (walk.length ===10) { 
        var WalkN=[]; 
        var WalkS=[];
        var WalkE=[];
        var WalkW=[];
        console.log(walk);
        walk.forEach(function(elemento) { 
            console.log(elemento);
            console.log(walk);
            switch (elemento) { 
                case 'n':
                 WalkN.push(elemento);
                 break;
                case 's':
                 WalkS.push(elemento);
                 break;
                case 'e':
                 WalkE.push(elemento);
                 break;
                case 'w':
                 WalkW.push(elemento);
            }
            
            if (WalkN.length===WalkS.length && WalkE.length===WalkW.length) {
              return true
            }
            else { return false }
        });
        console.log( WalkN,WalkS,WalkE,WalkW);
    } else {
        return false 
    }
}
isValidWalk(['n','s','n','s','n','s','n','s','n','s'])
    
answered by 02.07.2018 в 21:01
1

You can do it this way too:

var mi_array =  ['n','s','n','s','n','s','n','s','n','s'];
 isValidWalk(mi_array);

 function isValidWalk(walk) {
    if (walk.length == 10) { 
    var WalkN = []; 
    var WalkS = [];
    var WalkE = [];
    var WalkW = [];

    for (var i = 0; i < walk.length; i++){ 

        switch (walk[i]) { 
            case 'n':
             WalkN.push(walk[i]);
             break;
            case 's':
             WalkS.push(walk[i]);
             break;
            case 'e':
             WalkE.push(walk[i]);
             break;
            case 'w':
             WalkW.push(walk[i]);
        }

     if (WalkN.length == WalkS.length && WalkE.length == WalkW.length) {
         return true
     }
     else { return false }
    }
}
else {
    return false 
}
}
    
answered by 02.07.2018 в 21:08