2

withを使用してGMail APIからデータを受信し、それをjQuery プラグインである に投入しています。問題は (ページのデモで皮肉なことに示されているように)、次のようなものを入れると:$.ajax()dataType: "xml"$.xml2json

<animals>
     <dog>
          <name>Rufus</name>
          <breed>labrador</breed>
     </dog>
     <dog>
          <name>Marty</name>
          <breed>whippet</breed>
     </dog>
     <cat name="Matilda"/>
</animals>

私はこれを得る:

{
    animals: {
        dog: [
            {
                name: 'Rufus',
                breed: 'labrador'
            }, {
                name: 'Marty',
                breed: 'whippet'
            }
        ],
        cat: {
            name: 'Matilda'
        }
    }
}

とにかく、ご覧のとおり、<animals>には が 2 つあり<dog>、 は 1 つだけ<cat>です。したがって、animals["cat"]はオブジェクトであり、 はオブジェクトanimals["dog"]の配列です。同様に、<entry>GMail によって返されるfeed["entry"]タグが 1 つだけの場合、 はその中にあるものの配列ですが、タグが複数ある場合feed["entry"]は、エントリの配列であり、その中にあるものの配列です。

私がやりたいことは、条件ステートメントを使用して、1 つ以上のエントリがあるかどうかに応じて、さまざまなことを行うことです。そのためには、エントリの数を示すブール値が必要です。どうすればそれを行うことができますか?JQuery へようこそ。

編集: 別の可能な答えは、プラグイン自体のソースを編集し、それが単独のタグ (配列のようなオブジェクト) なのか、それともたくさんあるのか (" true" 配列)。

4

4 に答える 4

3

concatここでできる最善のことは、単にオブジェクト/配列を空の配列にすることだと思います:

var obj = {a:"hello"};
[].concat(obj); // [{a:"hello"}]

var arr = [{a:"hello"}];
[].concat(arr); // identical results

したがって、オブジェクトを修正するには:

for ( var prop in obj ) {
    obj[prop] = [].concat(obj[prop])
}

このようにして、常に配列を取得し、どの配列を持っているかを心配する必要はありません。

于 2012-11-10T14:20:47.660 に答える
2
var json = {
    animals: {
        dog: [
            {
                name: 'Rufus',
                breed: 'labrador'
            }, {
                name: 'Marty',
                breed: 'whippet'
            }
        ],
        cat: {
            name: 'Matilda'
        }
    }
};

for ( var i in json ) {
    if ( json.hasOwnProperty( i ) ) {
        if ( json[i] instanceof Array ) {
            // you have an array, do as you please
        } else {
            // you have an object, do as you please
        }
    }
}
于 2012-11-10T14:19:10.077 に答える
1

jQuerytype()メソッドを使用してコードを合理化し、完全にクロス ブラウザーに準拠したテストを利用できます。

API リファレンス : http://api.jquery.com/jQuery.type/

$.each(data, function(i, item) {

    switch($.type(item)) {
      case 'string':
        /* string code*/
        break;

      case 'array':
        /* aray code*/
        break;

        /* ....etc*/
    }
});
于 2012-11-10T16:17:46.607 に答える
1

これは xml2json のバグであり、より一般的には XML を JSON に変換する際の問題です。XSLT や XSD のような記述ドキュメントがなければ、何かがコレクションであることをシリアライザーに伝える方法がありません。より正式な方法で XML を JSON に変換するために、このようなものを調べたいと思うかもしれません。

それまでの間、変数が配列でない場合は強制的に配列にし、そうである場合はそのままにしておく方法を次に示します。

x = [].concat(x);

注:これは、@Asadの回答から優れた方法を使用するために、事後に編集されました

あなたが観察したように、これは多次元配列で失敗し始めるので、どの要素が常にコレクションであるかを記述するために XSLT を使用し始めたほうがよいように思えます。

そして使わないinstanceof

失敗するエッジケースがありinstanceofます。like で使用されるinstanceof演算子は、特定のコンストラクター (この場合は ) がプロトタイプ チェーンに存在するx instanceof Arrayかどうかをテストします。ただし、同じドメインに存在し、オブジェクトをその親に直接渡すことができるポップアップ ウィンドウや iframe など、変数が別のウィンドウからのものである場合、これは失敗します。window.Array

于 2012-11-10T14:20:32.960 に答える