"水合物"像PHP一样使用json数组的Javascript对象实例

时间:2015-01-14 08:56:55

标签: javascript php arrays json object

这是"问题",我用这样的数据填充PHP对象:

public function hydrate(array $data){
    foreach($data as $key=>$value){
        $method = 'set'.ucfirst($key);
        if(METHOD_EXISTS($this,$method)){
            $this->$method($value);
        }
    }
}

现在,我想把它变成javascript对象而不是PHP,所以,我得到了"数据数组"从我的数据库与.ajax调用,我得到一个JSON对象"看起来"像这样:

{"id":"44","name":"test","testKey":"qklfjmdjfq88"}

我的Javascript"对象"看起来像这样:

function myObject(){
    var element,id,name,testKey;

    this.hydrate = function(ajaxData){
        //THIS CODE DOES NOT WORK
        //THAT IS THE PROBLEM
        Object.keys(ajaxData).forEach(function(key){
            console.log("function loop key : "+key);//OK
            console.log("function loop value : "+ajaxData[key]);//OK
            this.key = Element[key];
        });
    };
}

所以,一旦我收到我的JSON"数组"在我的js脚本中,我想把它变成一个js对象实例,所以我这样做:

var myCurrentObject = new myObject();
myCurrentObject.hydrate(/*WHAT MY AJAX CALL RETURN*/);
console.log(myCurrentObject.name);
//console shows undefined...

所以问题似乎是在.hydrate函数中... this.key与myObject实例不对应var ...(name / id / testKey)如何使用看起来像的函数填充js对象实例我在使用php时使用的那个?

感谢您的帮助/阅读

1 个答案:

答案 0 :(得分:4)

在此功能中

this.hydrate = function(ajaxData){
    Object.keys(ajaxData).forEach(function(key){
        console.log("function loop key : "+key);
        console.log("function loop value : "+ajaxData[key]);
        this.key = Element[key];
    });
};

this.key不是指myObject,您应该尝试:

this.hydrate = function(ajaxData){
    Object.keys(ajaxData).forEach(
      // Execute a function passing param this as obj that return a function 
      // (closure)
      (function(obj){
        return function(key){
            obj[key] = ajaxData[key];
        };
      })(this)
    );
};

或将其保存在变量

this.hydrate = function(ajaxData){
    var that = this;
    Object.keys(ajaxData).forEach(function(key){
        that[key] = ajaxData[key];
    });
};

或更简单地使用for循环

this.hydrate = function(ajaxData){
    var k =  Object.keys(ajaxData);
    for(var i=0, len = k.length; i<len; i++){
        this[k[i]] = ajaxData[k[i]];
    }
};