我通过$ .ajax请求从API返回JSON,最后得到一块JSON:
var result = {
"status": 200,
"offset": 5,
"limit": 25,
"total": 7,
"url": "/v2/api/dataset/topten?",
"results": [
{
"datasets": [
"dataset",
"tt_all"
],
"id": "Hxb6VtpFRQ9gEr",
"title": "Venues",
"type": "topten",
"url": "/v2/dataset/topten/Hxb6VtpFRQ9gEr"
},
}
或类似的东西。嵌套数组在更大的请求中包含更多结果。
我想解析这些信息,把它放到一个对象中,并有可用于该对象的方法从各个层面提取特定的信息 - 例如:
result.title => "Venues" or result.id => "Hxb6v...."
但是,AJAX请求的输出可以由定义的用户分配给var,所以我想在退出ajax成功函数并将其分配给结果之前,将一个函数粘贴到具有可用方法的对象中。或者其他什么。
我不想特别说:
Object.prototype.method = function(){ // extend Object here }
方法因为它让人生气。
如果我制作另一个对象来扩展原型:
function Datalump(){};
Datalump.prototype.title = function(){
// get title or something here
};
我正在努力解决什么问题并将事情分配给错误的事情。
如何进行此方法/对象创建?
任何建议或指示都将不胜感激。
更新:谢谢大家的帮助 - 它非常具有启发性。我已经将Mike Brant的答案标记为正确,因为它似乎最适合我提出的问题。 George Jempty的回答也是非常有用的学习经历。
我实际上在项目中的方向略有不同(新要求!),但所有答案的一部分可能会成为'alpha'。
非常感谢所有人。
答案 0 :(得分:3)
如果你有一个javascript对象(就像你将JSON解析成对象后得到的那样),你可以像这样添加你想要的任何方法:
result.getTitle = function() {
// return title value of interest
return this.results.title;
}
result.getId = function() {
// return id value of interest
return this.results.id;
}
此处result
是解析JSON后的对象。
答案 1 :(得分:1)
创建一个包装JSON结果的模块。该模块将返回原始结果 plus 您可能需要的任何便利方法。然后使用underscore.js,特别是_.result来与包装结果进行交互。这样,您无需关心是否正在访问包装结果的原始属性或其中一种便捷方法。
var wrappedResult = WrappedResult(result);
var status = _.result(wrappedResult, 'status');
var foobar = _.result(wrappedResult, 'foobar');
如果详细程度超过_.result的便利性,您可以直接致电wrappedResult.status
或wrappedResult.foobar()
WrappedResult的实施:
var WrappedResult = function(result) {
return _.extend({}, result, {
foobar: function() {
console.log('foobar');
}
}
}
无论如何都像上面那样;你可能想要扩展_.clone(结果)。
BTW underscore.js绝对没有必要,尽管在这种情况下它可以很好地描述你正在做什么(除了初始属性之外,你还使用某些方法“_.extend”结果)。相反,用一个对象包装你的结果,然后直接添加方法,类似于另一个答案:
var WrappedResult = function(result) {
result.foobar = function() {
console.log('foobar');
};
return result;
}