-1

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);
        }
    });

この場合、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 メソッドで、プロパティが存在する場合、どのように呼び出すのですか?? オブジェクトとそのプロパティを次のような配列として保持します。

params = ["user","name"]

しかし、次のように呼び出すことはできません:

object.["user","name"]
4

4 に答える 4

2

if関数内のステートメントをget_property関数のforループに置き換えcheckNestedます。次に、trueorfalseを返す代わりに、見つかった値or を返します""

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ステートメントの値を変更することだけでした。

于 2012-11-12T14:57:32.157 に答える
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}
于 2012-11-12T14:54:48.627 に答える
0

あなたは物事を過度に複雑にしています。オブジェクトのツリーがわかっている場合は、次のように呼び出します。

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

未定義のプロパティが予想される場合 (実際には、それは何か他の問題があることを意味します):

var prop;
try {
    prop = obj.user.name;
}
catch (e) {
    prop = null;
}
于 2012-11-12T14:56:58.437 に答える
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 の回答を参照してください。誰かがこのようなものに似ている場合に備えて、この答えを保持してください。

于 2012-11-12T14:55:05.507 に答える