如果我们有一个不存在的数组,我们检查数组的值就会给我一个错误。 “变量未定义”
例如我有:
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上搜索了很多以找到答案,但我不能...
答案 0 :(得分:1)
要实现的是javascript中没有多维数组。很容易使数组元素包含一个数组,并使用它,但是你所做的所有引用都必须使用这个考虑。
所以,你可以做到
arr = []; // or more appropriately {}, but I'll get to that soon
arr['house'] = [];
arr['house']['rooms'] = 2;
但是在做
arr['house']['rooms'] = 2;
除非您已定义arr
和arr['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