2012-11-12 45 views
-1

我正在使用mongodb和ajax调用来检索数据。当它转向javascript对象时,我用来生成html的属性有时不存在。 看看这个电话:在N级调用对象属性javascript

$.ajax({ 
     url: 'api/v1/mention/'+id, 
     type: "GET", 
     dataType: "json", 
     data : {login : "demo"}, 
     success: function(mention) { 
      display_mention_text(mention.texto); 
     } 
    }); 

在这种情况下我打电话mention.texto,但可以mention.picture或任何属性。有时它是未定义的,并使应用程序崩溃。

该方法从一个对象中调用一个属性,如果它未定义,则返回一个空字符串。 为调用此方法的一些例子(第一个是一个对象,其他都属性):

get_property(mention,"text") 
get_property(mention,"user","name") 
get_property(mention,"picture") 

的方法被定义如下:

function get_property(obj){ 
    var args = Array.prototype.slice.call(arguments), 
    obj = args.shift(); 
    if (checkNested(obj,args)) { 
     //what should I do here? 
    } else{ 
        //the property is undefined and returns "" 
     ""; 
    }; 
} 


    //check if a object has N levels of propertys 
function checkNested(obj /*, level1, level2, ... levelN*/) { 
    var args = Array.prototype.slice.call(arguments), 
     obj = args.shift(); 

    for (var i = 0; i < args.length; i++) { 
    if (!obj.hasOwnProperty(args[i])) { 
     return false; 
    } 
    obj = obj[args[i]]; 
    } 
    return true; 
} 

在第一种方法get_property,如果财产确实存在,我该怎么称呼? 我有对象,他propertys作为数组一样: 对象

params = ["user","name"] 

,但我不能像以下称:

object.["user","name"] 
+0

将'get_property'函数中的'if'语句替换为'checkNested'函数的'for'循环。然后,不要返回“true”或“false”,而是返回找到的值或'“”'。 –

+0

但函数checkNested返回true或false,而不是值。 –

+0

我发布了[一个答案](http://stackoverflow.com/a/13345966/1689607),我做了解释。但是,再次,*替换整个if语句,并将其他函数中的'for'语句置于其位置。然后*改变*返回值,所以你不再返回'true'或'false'。 –

回答

2

在更换if声明get_property函数与函数中的for函数。然后代替返回truefalse,返回找到的值或""

function get_property(obj){ 
    var args = Array.prototype.slice.call(arguments), 
     obj = args.shift(); 

    // Here's your 'for' loop. The 'if' statement is gone. 
    for (var i = 0; i < args.length; i++) { 
     if (!obj.hasOwnProperty(args[i])) { 
      return ""; // I changed the value of this 'return' statement 
     } 
     obj = obj[args[i]]; 
    } 
    return obj; // I change the value of this 'return' statement 
} 

同样,我所做的就是副本从一个功能贴上自己的代码给对方,并更改return语句的值。

+0

这段代码非常酷,我很专注于忘记另一个的新方法 –

1

您可以通过这种方式实现自己的目标(没有必要的checkNested功能):

//Parameters {obj, prop1, prop2, ... propN} 
function get_property(){ 
    var args = Array.prototype.slice.call(arguments), 
     obj = args.shift(), 
     prop = args.shift(); 

    if(obj.hasOwnProperty(prop)){ 
     if(args.length > 0){ 
      //Calling 'get_property' with {obj[prop1], prop2, ... propN} , and so on 
      return get_property.apply(get_property, [obj[prop]].concat(args)); 
     }else{ 
      return obj[prop]; 
     } 
    }else{ 
     return ""; 
    } 
}​ 

用法:

var o = { 
    "a" : { 
     "b" : 5 
    } 
}; 

console.log(get_property(o,"c"));  // "" 
console.log(get_property(o,"a","b")); // 5 
console.log(get_property(o,"a"));  // {"b":5} 
0

你只是在寻找一个简单的递归函数。

function get_property(obj, prop) { 
    if (obj[prop]) { 
     return obj[prop]; 
    } 
    else { 
     var end; 
     for (var p in obj) { 
      if (obj.hasOwnProperty(p)) { 
       end = get_property(obj[p], prop); 
      } 
     } 
     if (!end) { 
      // If we're there, it means there's no property in any nested level 
      return; 
     } 
     else { 
      return end; 
     } 
    } 
} 

编辑:看起来像我误解了你的问题。请参阅@工程师的答案。保持这个答案,以防某人看起来像这样的事情。

0

你太过于复杂了。如果你知道你的对象的树,只要致电:

obj['user']['name']; 

如果你希望未定义的属性(真的,这意味着还有别的错误):

var prop; 
try { 
    prop = obj.user.name; 
} 
catch (e) { 
    prop = null; 
} 
+0

实际上,在这种情况下,为了便于阅读,最好使用'obj.user.name'。 – ThiefMaster

+0

@ThiefMaster肯定,无论他最适合他。 –

+0

我知道这三个对象,但对象用户的属性名称可能是未定义的。如果是这样的话obj ['user'] ['name']会引发异常。 –