对象/数组是否存在于javascript中

时间:2013-07-28 19:00:49

标签: javascript

我正在尝试从RSS Feed中提取内容 - 问题是每个RSS Feed都有不同的图像,内容等格式。

我正在尝试查看javascript或jquery中是否存在某些对象:

item.mediaGroups[0].contents[0].url

如何在if语句中查看?我一直在寻找没有这种结构的饲料:

Uncaught TypeError: Cannot read property '0' of undefined 

也尝试过:

if (typeof item.mediaGroups[0].contents[0].url === "undefined")

但我仍然遇到同样的错误。

谢谢!

6 个答案:

答案 0 :(得分:6)

没有“简单”的内置方式来进行这种深度检查。推理很简单 - 大多数时候你都知道你正在反对的对象的类型。

你可以这样做:

if (typeof item !== "undefined" &&
    typeof item.mediaGroups !== "undefined" &&
    typeof item.mediaGroups[0] !== "undefined" &&
    typeof item.megiaGroups[0].contents !== "undefined" &&
    typeof item.megiaGroups[0].contents[0] !== "undefined" &&
    typeof item.mediaGroups[0].contents[0].url !== "undefined"){

当您键入所有您可能想要考虑数据结构的内容时,因为实际上不是您应该开始的情况:)

(提示,你可以跳过除了第一个之外的所有类型,但我认为typeof在这里是一个很好的说明。)

真正的问题是:

为什么您不确定数据的结构是什么?

如果您正在查询数据(例如RSS源中的XML),则可以使用XPATH或查询选择器进行有效的方法。对象属性访问是为对象构建的,您查询的是文档。当然,这可能是一堆丑陋的检查,就像你可以用重型螺丝刀敲钉子一样。

您可以在Stack Overflow中看到有关如何使用DOM方法解析XML的this question

答案 1 :(得分:1)

如果您不确定是否存在属性,请尝试使用此辅助函数:

function getProperty(root) {
    var l = arguments.length, i, undefined;
    for( i=1; i<l; i++) {
        if( typeof root[arguments[i]] == "undefined") return undefined;
        root = root[arguments[i]];
    }
    return root;
}

然后你可以这样称呼它:

var url = getProperty(item,'mediaGroups',0,'contents',0,'url');

作为一种更“朦胧”的方式,你可以试试这个:

try {url = item.mediaGroups[0].contents[0].url;}
catch(e) {url = undefined;}

答案 2 :(得分:1)

在这种情况下,我会检查两个数组的长度,以确保 - 在假设在索引0处定义了对象

item.mediaGroups.length > 0

and

item.mediaGroups[0].contents.length > 0

作为外部检查,你也可以投入

if(item.mediaGroups){
} 

答案 3 :(得分:0)

“可选链”怎么样(在 ES2021 规范中描述,并且已经在除三个浏览器之外的所有浏览器中实现)?

来自 MDN:

<块引用>

可选链运算符提供了一种简化访问的方法 当引用可能存在时,通过连接的对象获取值 或函数可能未定义或为空。

可选的链接?。如果值在 ? 之前,则停止评估。是 undefined 或 null 并返回 undefined 所以它给了我们一种方法来处理可能的 undefined/nullsish 值

item?.mediaGroups[0]?.contents[0]?.url // will evaluates to undefined if either of those is undefined.

答案 4 :(得分:-1)

item.mediaGroups[0].contentsundefined,您必须检查它。

if(item.mediaGroups && item.mediaGroups[0].contents) {
    return item.mediaGroups[0].contents[0].url;
}

答案 5 :(得分:-1)

它不是if语句的解决方案(如请求的那样),但您可以使用异常来实现类似的功能。像这样:

function throwOrReturn(thing){

    if(typeof thing === 'undefined'){

        throw "Didn't find it..."

    }else{

        return thing

    }

}

// The unknown thing.
var a = {
    b1: {
    },
    b2: {
        c: 'lookingFor'
    }
}

var c

// Test our different paths.
try{

    // First guess.
    c = throwOrReturn(a.b1.c.d)+" - a.b1.c.d"

}catch(error){

    try{

        // Second guess.
        c = throwOrReturn(a.b[45][34].c)+" - a.b[45][34].c"

    }catch(error){

        try{

            // Third guess.
            c = throwOrReturn(a.b2.c)+" - a.b2.c"

        }catch(error){

            // Try more guesses, or give up.
            c = "notFound"

        }

    }

}

console.log("c:", c) // Logs: "c: lookingFor - a.b2.c" 

它很漂亮,但值得一提的是它。