检查是否定义了数组[4] [3] [7] [3]

时间:2011-08-23 20:08:45

标签: javascript

当存在单维数组时,很容易通过简单调用arr[6]来检查它是否已定义,如果此类属性不存在则调用undefined或调用typeof arr[6] === undefined }。

问题是,在我的情况下,我有arr[5][1][6][2][5][3][7],其中arr[5]可能不存在,或arr[5][1]等等。这自然会触发错误:TypeError: Cannot read property [..]一种解决方案是编写许多IF语句。但是,有没有更好的解决方案,我可以简单地检查arr[5][1][6][2][5][3][7]是否已定义?

6 个答案:

答案 0 :(得分:2)

我想不出更好的事情:

var defined = false;
try {
   defined = !!arr[5][1][6][2][5][3][7]
} catch(e)
{
   // nothing
}

但设计严重不好。

答案 1 :(得分:1)

因为这看起来像一个有趣的问题,我写了这个函数以一种非常好的非特殊方式来解决它:)

var deepCheck = function(arr, indexes) {
    var level = arr;
    while(indexes.length) {
         var v = indexes.shift()

         if(!level[v]) {
             return false;
         }

         level = level[v];
    }  

    return true;
};

现在说你有这个:

arr[foo][bar][baz];

您可以使用...

进行检查
deepCheck(arr, [foo, bar, baz]);

也许我应该指出,我有点同意,如果你确实拥有非常长的阵列,那听起来就像是一个设计问题。

答案 2 :(得分:1)

通过使用try / catch块,您可以检查是否可以访问该元素。

var x;
try {
   x = arr[5][1][6][2][5][3][7];
} catch(TypeError)
{
   // the element cannot be accessed
   x = undefined;
}

然后检查是否' x'是否使用if语句定义。

答案 3 :(得分:1)

务实的方法是将这个问题分解为其组成部分;看看已知的数据和手头的工具。

那么,我们知道什么 - 在检查是否定义了arr[5][1][6][2][5][3][7]的情况下,我们知道要检查的密钥。现在问问自己,我们在JavaScript中有哪些工具?要检查是否定义了Array索引,我们可以与null进行比较,即:

if (array[index] === null) { 
    return false 
}

如果我们尝试编写此代码,首先应该想到的一件事就是按顺序遍历每个键:例如:

if (array[5] === null) {
    return false;
} else if (array[5][1] === null) {
    return false
} ...snip...

// Good news, it's defined!
return true

显然这种方法可以改进,它需要写出大量重复的代码,它不灵活且不可重用。如果你发现自己一遍又一遍地做同样的事情,你可能有一个很好的候选者来构建循环。为了获得一个循环,你需要一个变量,每次重复都会改变 - 在上面的例子中,变量是我们正在检查的嵌套数组的最右边元素。首先,让我们首先列出我们的变体:

var variants = [ 5, 1, 6, 2, 5, 3, 7 ];
for (var i = 0; i < variants.length; i++) {
   console.log("variant: " + variants[i]);
}

我们离开这里的地方?事情变得有点困难,您需要了解如何通过JavaScript中的引用传递数组并在循环体中利用它;最终你可能会得到这样的结论:

function arrayDimensionsExist(source, dimensions) {
    var currentDepth = source;
    for (var i = 0; i < dimensions.length; i++) {
        var key = dimensions[i];
        if (currentDepth[key] === null) {
            return false;
        } else {
            currentDepth = source[key];
        }
    }
    return true;
}

答案 4 :(得分:0)

将代码访问trycatch。如果它有效,它就可以工作,如果没有,你会得到一个很好的例外,你可以做出相应的反应。

作为旁注,我不禁想到是什么促使你设计你的系统......

答案 5 :(得分:0)

该语言没有内置解决方案,但您可以使用以下函数处理它:

var verifyIndexes = function(target) {
    var current = target;
    for (i = 1; i < arguments.length; i++) {
        if (arguments[i] in current) {
            current = current[arguments[i]];
        } else {
            return false;
        }
    }
    return true;
}

var myArray = [[[1, 2, 3], 4], 5];
console.log(verifyIndexes(myArray, 0));        // true
console.log(verifyIndexes(myArray, 0, 0, 0));  // true
console.log(verifyIndexes(myArray, 0, 0, 3));  // false
console.log(verifyIndexes(myArray, 0, 1));     // true
console.log(verifyIndexes(myArray, 0, 2));     // false