从JSON创建一个对象并在Javascript中为它提供一些方法

时间:2013-09-16 16:25:43

标签: javascript jquery

我通过$ .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'。

非常感谢所有人。

2 个答案:

答案 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.statuswrappedResult.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;
}