我正在使用mongodb和ajax调用来检索数据。当它转向javascript对象时,我用来生成html的属性有时不存在。 看看这个电话:
$.ajax({
url: 'api/v1/mention/'+id,
type: "GET",
dataType: "json",
data : {login : "demo"},
success: function(mention) {
display_mention_text(mention.texto);
}
});
在这种情况下,我正在调用提及.texto,但可以提及.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中,如果属性确实存在,我该如何调用? 我会把对象和他的属性作为一个数组,如: 对象
params = ["user","name"]
但我不能这样打电话:
object.["user","name"]
答案 0 :(得分:2)
将if
函数中的get_property
语句替换为for
函数中的checkNested
循环。然后,不是返回true
或false
,而是返回找到的值或""
。
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
语句的值。
答案 1 :(得分: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}
答案 2 :(得分: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;
}
}
}
编辑:看起来我误解了你的问题。请参阅@ Engineer的答案。保留这个答案,以防有人看起来像这样的事情。
答案 3 :(得分:0)
你的事情太复杂了。如果您知道对象的树,只需调用:
obj['user']['name'];
如果您期望未定义的属性(实际上,这意味着还有其他错误):
var prop;
try {
prop = obj.user.name;
}
catch (e) {
prop = null;
}