如何查找数组的值是否未定义?

时间:2013-10-29 15:00:28

标签: javascript arrays

如果我们有一个不存在的数组,我们检查数组的值就会给我一个错误。 “变量未定义”

例如我有:

var arr = new Array();

arr['house']['rooms'] = 2;

我用

if ( typeof arr['plane']['room'] != 'undefined' ) )

它说arr ['plane']没有定义......

我不想用这个:

if ( typeof arr['plane'] != 'undefined' ) ) {
    if ( typeof arr['plane']['room'] != 'undefined' ) {

    }
}

在php中我使用的isset对我来说很好用,我在google上搜索了很多以找到答案,但我不能...

3 个答案:

答案 0 :(得分:1)

要实现的是javascript中没有多维数组。很容易使数组元素包含一个数组,并使用它,但是你所做的所有引用都必须使用这个考虑。

所以,你可以做到

arr = [];  // or more appropriately {}, but I'll get to that soon
arr['house'] = [];
arr['house']['rooms'] = 2;

但是在做

arr['house']['rooms'] = 2;
除非您已定义arrarr['house'],否则

会给您一个错误。

如果您已定义arr但未定义arr['house'],则引用arr['house']是有效的语法 - 但返回值(适当地)将为undefined

当你看arr['plane']['room']时,这就是你所处的位置。 arr已定义,所以没关系,但arr['plane']返回undefined,引用undefined.['room']会引发错误。

如果你想避免错误并且有多个级别的引用,你将不得不确保存在所有级别但是最低级别。

你被if (arr && arr['plane'] && arr['plane']['room'])困住了。

或许if (arr && arr['plane'] && room in arr['plane']可能会更准确,具体取决于您的需求。第一个将检查arr['plane']['room']是否具有真值,而第二个将检查arr['plane']['room']是否存在(并且可能具有假值)。

数组与对象

数组和对象非常相似,并且都可以使用[]表示法访问,因此它有点令人困惑,但从技术上讲,您正在使用数组的对象方面来处理您正在做的事情。请记住,所有数组(以及基元以外的所有数组,数字,字符串和布尔值)都是对象,因此数组可以完成对象可以执行的所有操作,以及更多。但是数组只能使用数字索引,即arr [1] [2]。当您使用字符串引用数组时,您正在尝试访问与该字符串匹配的基础对象的成员。

但在这种情况下,它并不重要。没有多维数组 - 或对象。

带有对象的[]表示法只是一种使用变量检查对象成员的方法。 arr ['plane'] ['rooms']实际上相当于arr.plane.rooms。但也许arr.plane.room符号有助于更清楚地说明为什么必须先检查arr.plane(和arr)。

答案 1 :(得分:0)

如果要测试对象是否存在,请使用以下命令:

if ( 'plane' in arr && 'room' in arr.plane ) {
    // Do something
}

答案 2 :(得分:0)

这不是一个数组,而是一个对象,又名associative array。您可以这样声明:

var aarr = { house: { rooms: 2 } };

现在你可以做到:

if (aarr.house && aarr.house.rooms) {/* do stuff */ } 

或更丑,但更短:

if ((aarr.house || {}).rooms) {/* do stuff */ } 

See also ...

要更一般地遍历对象以在其中查找路径,您可以使用:

Object.tryPath = function(obj,path) {
    path = path.split(/[.,]/);
    while (path.length && obj) {
      obj = obj[path.shift()];
    }
    return obj || null;
};
Object.tryPath(aarr,'house.rooms'); //=> 2
Object.tryPath(aarr,'house.cellar.cupboard.shelf3'); //=> null

JsFiddle