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;
}

resultJSON が解析された後のオブジェクトは次のとおりです。

于 2013-09-16T16:38:44.800 に答える
1

JSON の結果をラップするモジュールを作成します。モジュールは、元の結果に加えて、さらに必要な便利なメソッドを返します。次に、underscore.js と特に_.resultを使用して、ラップされた結果を操作します。この方法では、ラップされた結果の元のプロパティの 1 つにアクセスしているか、便利なメソッドの 1 つにアクセスしているかを気にする必要はありません。

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

_.result の利便性よりも冗長性が勝る場合は、wrappedResult.statusorwrappedResult.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 に答える