0

我正在检查一个Object(如关联数组)以查看是否有一部分数据可用,但我在检查它是否可用的语句中undefined出现错误!ifundefined

我有一个Object这样的:

var data = {
    1: {
        2: {
            3: [
                ["a","b"],
                ["c","d"],
            ],
        }
    }
}

我也尝试过double-quotesvar data = { "1": { "2": { ...

这些是if我已经尝试过的陈述。所有这些都失败了,完全在语句Firebug中生成:TypeError: data[1][2][3] is undefinedif

if (typeof data[1][2][3] == "undefined") {
if (data[1][2][3] === undefined) { 
// when I have double quotes
if (typeof data["1"]["2"]["3"] == "undefined") {
if (data["1"]["2"]["3"] === undefined) { 

我在 jsfiddle.net 中检查了它,它工作正常。我尝试了所有我能想象到的东西,但是我仍然不知道为什么它在if声明中失败了。

更新

看看这个,天哪:

在此处输入图像描述

4

5 回答 5

2

如果variable[1][2][3]未定义,则脚本无法检查是否variable[1][2][3][4]未定义。您应该检查树的整个深度的未定义

if(1 in variable)
{
  if(2 in variable[1])
  {
     if(3 in variable[1][2])
     {
       if(typeof variable[1][2][3][4] === 'undefined'){
          // Do something
       }
     }
  }
}
于 2013-04-22T09:17:02.183 回答
1

If you don't know beforehand whether you have all the hierarchy needed to get to the element you're checking (e.g., you're checking e.Bubbles[2013][3][4]["layer_1"], but e.Bubbles[2013] doesn't exist, and you get TypeError), consider using error catching like this:

try {
    myData = e.Bubbles[2013][3][4]["layer_1"];
} catch (error) {
    myData = undefined;
    console.error("Couldn't get my data", error.name, error.message);
}

if (myData !== undefined) {
    // Do something with the data
}

At a cost of making code much less readable, you could also do something like this:

var _ref, _ref1, _ref2;
if ((_ref = e.Bubbles[2013]) != null ? (_ref1 = _ref[3]) != null ? (_ref2 = _ref1[4]) != null ? _ref2["layer_1"] : void 0 : void 0 : void 0) {
  // We know we have e.Bubbles[2013][3][4]["layer_1"] here
}

But I would recommend error catching.

于 2013-04-22T09:24:36.510 回答
1

更仔细地查看您的输出:

if (typeof e.Bubbles["2013"]["3"]["24"]["layer_1"] === "undefined") {
> TypeError e.Bubbles[2013][3][24] is undefined

即,因为您的测试太深了一级,所以它失败了。该["24"]物业不存在,因此您无法到达该["layer_1"]物业。

于 2013-04-22T09:15:38.220 回答
1

一些评论,也许解决方案介于两者之间:

也许您想使用否定版本

if (typeof data[1][2][3] !== "undefined") {

因为您似乎在条件主体中处理该数据,所以您想确保它实际上在您的 if 条件中定义的?Atm,如果数据未定义,则执行代码。

您是在代码中完全使用此对象还是仅用于演示目的?因为如果您检查data[1][2][3]并且data[1][2]已经未定义,尝试访问data[1][2][3]将引发错误,因为您正在尝试访问不存在对象的属性。

旁注:如果您有数字索引,使用数组而不是对象可能更合适?

于 2013-04-22T09:06:47.613 回答
-1

不要将它与未定义的比较...

如果您想检查其是否已定义,则只需将其放入 IF 条件中,例如...

var data = {
    1: {
        2: {
            3: [
                ["a","b"],
                ["c","d"],
            ],
        }
    }
}

if(data[1][2][3])
{
    alert("defined");
}
else
{
    alert("not defined");
}
于 2013-04-22T09:11:58.423 回答