我正在尝试从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")
但我仍然遇到同样的错误。
谢谢!
答案 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].contents
为undefined
,您必须检查它。
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"
它很漂亮,但值得一提的是它。