安全地检查多维数组中的元素在JavaScript中是否未定义?

安全地检查多维数组中的元素在JavaScript中是否未定义?,javascript,arrays,multidimensional-array,undefined,Javascript,Arrays,Multidimensional Array,Undefined,我想知道某个多维数组x中的元素是否未定义,例如: typeof x[i][j][k] === 'undefined' 问题是,如果例如x[i][j]未定义,我会得到一个错误。为了安全起见,我必须检查: typeof x === 'undefined' || typeof x[i] === 'undefined' || typeof x[i][j] === 'undefined' || typeof x[i][j][k] === 'undefined' 但是在JavaScript中有没有更简

我想知道某个多维数组
x
中的元素是否未定义,例如:

typeof x[i][j][k] === 'undefined'
问题是,如果例如
x[i][j]
未定义,我会得到一个错误。为了安全起见,我必须检查:

typeof x === 'undefined' 
|| typeof x[i] === 'undefined'
|| typeof x[i][j] === 'undefined'
|| typeof x[i][j][k] === 'undefined'
但是在JavaScript中有没有更简单的方法来检查
x[i][j][k]
是否未定义?

如果(x&&x[i]&&x[i][j]&&x[i][j][k]){}
是一种方法,前提是
未定义的
是一个错误的值,并且如果遇到它,会使if语句短路


作为替代方案。有时,您可以尝试使用try-catch块,并在它不起作用时处理它

除了可以通过如下方式编写代码来缩短代码之外,没有其他方法可以进行检查:

if(x && x[i] && x[i][j] && x[i][j][k]) {
 }

只要&&之前的术语继续返回true,上述语句就会继续检查。一旦它发现一个假值或未定义的,它将停止检查铰削术语。

嵌套三元将更容易,但可读性也要差得多

let x = [[[[]]]], // will return true
    i = 0,
    j = 0,
    k = 0;

    let isDefined = x ? x[i] ? x[i][j] ? x[i][j][k] ? true : false : false : false : false;

一旦删除数组的任何部分
isDefined
将返回false。它还将按顺序求值,因此您可以为假值返回其他值,以通知其失败的深度。

您可以将其提取到一个递归函数中,该函数将检查任意嵌套级别:

const arr=[1,2,['a','b',[3,未定义]];
const OUT_OF_BOUNDS=null;
函数getNesteElement(arr,levels,levelIndex=0){
常量级别=级别[级别索引];
如果(标高<0 | |标高>=arr.length){
返回到边界外;
}
返回(levelIndex==levels.length-1)
?arr[水平]
:GetNesteElement(arr[level],levels,levelIndex+1);
}
函数isNestedElementUndefined(arr,级别){
GetNesteElement的返回类型(arr,levels)=“未定义”;
}
//arr[2][2][0]==3,未定义
log(`arr[2][2][0]=${getNestedElement(arr[2,2,0])}`);
log(`it undefined?${isNestedElementUndefined(arr[2,2,0])}`);
//arr[2][2][1]未定义
log(`arr[2][2][1]=${getNestedElement(arr[2,2,1])}`);
log(`it undefined?${isNestedElementUndefined(arr[2,2,1])}`);
//arr[2][2][2]超出范围,因此它将为空
log(`arr[2][2][2]=${getNestedElement(arr[2,2,2])}`);

log(`it undefined?${isNestedElementUndefined(arr[2,2,2])}`)是i、j和k整数吗?还是字符串?您不是在使用提供有效索引/属性名称的for循环吗?为什么数据中有未定义的部分?不是所有阵列都有相同的长度或间隙吗?尺寸有不同的长度。我不是在整个阵列中循环。我只需要检查一些元素。你能发布一个数组的示例吗?你的数据结构是按位置映射的,这意味着矩阵中的某个位置具有特定的含义,即(x[5][6][3]是x速度),因此你必须参考特定的索引?什么要求您必须引用特定索引?您尝试过吗!!x[i][j][k]谢谢。但我仍然需要穿越所有的维度。然而,我发现我对“更简单的方法”的表述相当模糊。@Daniel我编辑了一个替代方法。如果你能轻松地突破它,你可以用试抓挡块。并不总是推荐使用,但有时也可以。这是解决此问题的绝佳方法,但在这种情况下可能有些过头了。:)@甘特:当然可以,但这取决于OP是否需要一个通用解决方案或更多的一次性特定检查:)