当存在单维数组时,很容易通过简单调用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]
是否已定义?
答案 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)
将代码访问try
和catch
。如果它有效,它就可以工作,如果没有,你会得到一个很好的例外,你可以做出相应的反应。
作为旁注,我不禁想到是什么促使你设计你的系统......
答案 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