1

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

我正在尝试查看 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")

但我不断收到同样的错误。

谢谢!

4

6 回答 6

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,但我认为 typeof 在这里是一个很好的说明)。

真正的问题是:

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

如果您正在查询数据(例如 RSS 提要中的 XML),则可以使用 XPATH 或查询选择器来执行此操作。对象属性访问是为您查询的是文档的对象构建的。当然,通过一堆丑陋的检查是可能的,就像你可以用重型螺丝刀敲钉子一样。

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

于 2013-07-28T19:04:38.343 回答
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;}
于 2013-07-28T19:04:28.747 回答
1

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

item.mediaGroups.length > 0

and

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

作为外部检查,您还可以放入

if(item.mediaGroups){
} 
于 2013-07-28T19:04:42.740 回答
0

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

来自 MDN:

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

可选链接?如果 ? 之前的值停止评估。是 undefined 或 null 并返回 undefined 因此它为我们提供了一种处理可能 undefined/nullsish 值的方法

item?.mediaGroups[0]?.contents[0]?.url // will evaluates to undefined if either of those is undefined.
于 2021-01-28T17:03:42.293 回答
-1

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

if(item.mediaGroups && item.mediaGroups[0].contents) {
    return item.mediaGroups[0].contents[0].url;
}
于 2013-07-28T19:05:28.550 回答
-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" 

它并不漂亮,但它是一个值得一提的替代方案。

于 2013-07-28T19:59:11.807 回答