How to check if a multidimensional array item is set in JS?
Asked Answered
H

2

7

How to check if a multidimensional array item is set in JS?

w[1][2] = new Array;
w[1][2][1] = new Array;
w[1][2][1][1] = 10; w[1][2][1][2] = 20; w[1][2][1][4] = 30;

How to check if w[1][2][1][3] is set?

Solution with if (typeof w[1][2][1][3] != 'undefined') doesn't work.

I don't want to use an Object instead of Array.

Haydeehayden answered 2/6, 2013 at 14:2 Comment(8)
what about if (w[1][2][1][3] != 'undefined') ?Overliberal
that would check w[1][2][1][3] value is the text "undefined"Beekeeping
In what way does the typeof way not work?Beekeeping
@Patrick Evans, it returns error: TypeError: w[w1][w2][w3] is undefined in code: if (typeof w[w1][w2][w3][w4] != 'undefined') { return w[w1][w2][w3][w4]; }Haydeehayden
then you need to check each previous array element for existence before checking the others.Beekeeping
@karthikr, returns the same error like with "typeof"Haydeehayden
@Patrick Evans, thanks it works: if (typeof w[w1][w2][w3] != 'undefined' && typeof w[w1][w2][w3][w4] != 'undefined')Haydeehayden
possible duplicate of In JavaScript, is there an easier way to check if a property of a property exists?Yusuk
B
6

You are not checking the previous array elements existence before checking its children as the children elements cant exist if the parent doesnt

if( 
    typeof(w) != 'undefined' &&
    typeof(w[1]) != 'undefined' &&
    typeof(w[1][2]) != 'undefined' &&
    typeof(w[1][2][1]) != 'undefined' &&
    typeof(w[1][2][1][3]) != 'undefined' &&
  ) {
    //do your code here if it exists  
  } else {
    //One of the array elements does not exist
  }

The if will run the code in the else clause if it sees any of the previous elements not existing. It stops checking the others if any of the preceding checks returns false.

Beekeeping answered 2/6, 2013 at 14:30 Comment(0)
L
6

Here is a more generic way you can do it by extending the prototype of Array:

Array.prototype.check = function() {
    var arr = this, i, max_i;
    for (i = 0, max_i = arguments.length; i < max_i; i++) {
        arr = arr[arguments[i]];
        if (arr === undefined) {
            return false;
        }
    }
    return true;    
}

w.check(1, 2, 1, 4); //will be true if w[1][2][1][4] exists

or if you don't like prototype extension you could use a separate function:

function check(arr) {
    var i, max_i;
    for (i = 1, max_i = arguments.length; i < max_i; i++) {
        arr = arr[arguments[i]];
        if (arr === undefined) {
            return false;
        }
    }
    return true;
}

check(w, 1, 2, 1, 4); //will be true if w[1][2][1][4] exists
Lyricist answered 2/6, 2013 at 14:41 Comment(1)
I was unable to get your check function to work. See my test code below. I added a workaround below your 'check' that did work for me.Autoerotic

© 2022 - 2024 — McMap. All rights reserved.