从JSON创建一个对象,并在Javascript中给它一些方法

Making an object from JSON and giving it some methods in Javascript

本文关键字:方法 Javascript 创建 JSON 一个对象 并在      更新时间:2023-09-26

我通过$.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 分配给 var,因此我想创建一个函数,在它退出 ajax 成功函数并分配给结果或其他任何内容之前,将其粘贴到具有可用方法的对象中。

我不是特别想说:

Object.prototype.method = function(){ // extend Object here }  

方法,因为它使人生气。

如果我制作另一个对象来扩展原型:

function Datalump(){};  
Datalump.prototype.title = function(){
// get title or something here
};

我正在为传递给什么而苦苦挣扎,并将事情分配给错误的东西。

我该如何进行此方法/对象创建?

任何建议或指示将不胜感激。

更新:谢谢大家的帮助 - 这非常有启发性。我已经将迈克·布兰特的答案标记为正确,因为它似乎最适合我提出的问题。乔治·杰空的回答也是一次非常有用的学习经历。

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

非常感谢大家。

如果你有一个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 后拥有的对象。

创建一个包装 JSON 结果的模块。 该模块将返回原始结果,以及您可能需要的任何便利方法。 然后使用下划线.js特别是 _.result 与包装的结果进行交互。 这样,您无需关心是访问包装结果的原始属性之一还是访问一种方便的方法。

var wrappedResult = WrappedResult(result);
var status = _.result(wrappedResult, 'status');
var foobar = _.result(wrappedResult, 'foobar');

如果 _.result 的便利性被冗长所抵消,您可以直接调用wrappedResult.statuswrappedResult.foobar()

包装结果的实现:

var WrappedResult = function(result) {
    return _.extend({}, result, {
        foobar: function() {
            console.log('foobar');
        }
    }
}

无论如何,类似上面的东西;你可能想扩展_.clone(result)。

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

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