1

我通过 $.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 的回答也是一次非常有用的学习经历。

实际上,我在项目中的方向略有不同(新要求!),但所有答案的一部分可能会进入“阿尔法”。

非常感谢大家。

4

2 回答 2

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 后的对象。

于 2013-09-16T16:38:44.800 回答
1

创建一个包装 JSON 结果的模块。该模块将返回原始结果,以及您可能需要的任何便利方法。然后使用 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(result) 。

顺便说一句,underscore.js 绝不是必需的,尽管在这种情况下,它可以很好地准确描述您在做什么(除了初始属性之外,您还可以使用一些方法“_.extend”结果)。相反,用一个对象包装你的结果,然后直接添加方法,类似于另一个答案:

var WrappedResult = function(result) {
    result.foobar = function() {
        console.log('foobar');
    };

    return result;
}
于 2013-09-16T16:49:02.167 回答