"Hydrate" 具有 json 数组的 Javascript 对象实例,就像 PHP 一样
"Hydrate" a Javascript Object Instance with json array just like PHP does
这是 "problem",我用这样的数据填充 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,所以,我从我的数据库中得到 "data array" 一个 .ajax调用,我得到一个 JSON 对象 "looks" 像这样:
{"id":"44","name":"test","testKey":"qklfjmdjfq88"}
我的 Javascript "object" 看起来像这样:
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];
});
};
}
所以,一旦我在我的 js 脚本中收到我的 JSON "array",我想把它变成一个 js 对象实例,所以我这样做了:
var myCurrentObject = new myObject();
myCurrentObject.hydrate(/*WHAT MY AJAX CALL RETURN*/);
console.log(myCurrentObject.name);
//console shows undefined...
所以问题似乎出在 .hydrate 函数中... this.key 不对应于 myObject 实例变量... (name / id / testKey) 如何用一个填充 js 对象实例看起来像我在使用 php?
时使用的函数
感谢help/reading
在这个函数中
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]];
}
};
这是 "problem",我用这样的数据填充 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,所以,我从我的数据库中得到 "data array" 一个 .ajax调用,我得到一个 JSON 对象 "looks" 像这样:
{"id":"44","name":"test","testKey":"qklfjmdjfq88"}
我的 Javascript "object" 看起来像这样:
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];
});
};
}
所以,一旦我在我的 js 脚本中收到我的 JSON "array",我想把它变成一个 js 对象实例,所以我这样做了:
var myCurrentObject = new myObject();
myCurrentObject.hydrate(/*WHAT MY AJAX CALL RETURN*/);
console.log(myCurrentObject.name);
//console shows undefined...
所以问题似乎出在 .hydrate 函数中... this.key 不对应于 myObject 实例变量... (name / id / testKey) 如何用一个填充 js 对象实例看起来像我在使用 php?
时使用的函数感谢help/reading
在这个函数中
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]];
}
};