1

サーバーから次のような JSON を受け取ります。

{"0":{"0":"image1.jpg","1":"texthere","2":"0"},"1":{"0":"image66.jpg","1":"texthere","2":"1"},"2":{"0":"image12.jpg","1":"texthere","2":"2"},"3":{"0":"image44.jpg","1":"texthere","2":"3"},"4":{"0":"image34.jpg","1":"texthere","2":"4"},"5":{"0":"image33.jpg","1":"texthere","2":"5"},"6":{"0":"image21.jpg","1":"texthere","2":"6"},"7":{"0":"image32.jpg","1":"texthere","2":"7"},"8":{"0":"image13.jpg","1":"texthere","2":"8"},"9":{"0":"image11.jpg","1":"texthere","2":"9"},"10":{"0":"image03.jpg","1":"texthere","2":"10"},"length":"12"}

これをコーディングした開発者は、JSON_FORCE_OBJECT を PHP の json_encode メソッドのパラメーターとして使用しました。

JavaScript には、この構造を多次元配列に変換する "魔法" (つまり、カスタム関数ではない) がありますか?

私は次のようなものが欲しいです:

[["image1.jpg","texthere","2"],["image66.jpg","texthere","1"]]...

免責事項: - ネイティブ実装 (JQuery ではない) を探しています。- PHP は最終的に変更できます (必要な場合)。

事前に感謝します。

4

3 に答える 3

0

魔法ではありませんが、データをループして、データの値のタイプをテストできます。

基本的な例は次のとおりです。ただし、本番コードで必要なエラーチェックはありません。

var data = {"0":{"0":"image1.jpg","1":"texthere","2":"0"},"1":{"0":"image66.jpg","1":"texthere","2":"1"},"2":{"0":"image12.jpg","1":"texthere","2":"2"},"3":{"0":"image44.jpg","1":"texthere","2":"3"},"4":{"0":"image34.jpg","1":"texthere","2":"4"},"5":{"0":"image33.jpg","1":"texthere","2":"5"},"6":{"0":"image21.jpg","1":"texthere","2":"6"},"7":{"0":"image32.jpg","1":"texthere","2":"7"},"8":{"0":"image13.jpg","1":"texthere","2":"8"},"9":{"0":"image11.jpg","1":"texthere","2":"9"},"10":{"0":"image03.jpg","1":"texthere","2":"10"},"length":"12"};

function data_to_array(data) {
    var array = [];
    for (var key in data) {
        var value = data[key];
        if (typeof value === 'string') {
            array[key] = value;
        } else {
            array[key] = data_to_array(value);
        }
    }
    return array;
}

var array = data_to_array(data);
console.log(array);

hasOwnPropertyオブジェクトのプロトタイプが台無しになっている可能性があるかどうかのチェックを追加してください。おそらく、整数キーのみが配列に追加されていることを確認するためのチェックも追加する必要があります。

于 2012-04-12T10:21:24.367 に答える
0

組み込み関数はありません。JSON 文字列がある場合は、文字列の置換を行うことができます。それ以外の場合は、以下に示すようにループする必要があります。

var dataObject = {"0":{"0":"image1.jpg","1":"texthere","2":"0"},"1":{"0":"image66.jpg","1":"texthere","2":"1"},"2":{"0":"image12.jpg","1":"texthere","2":"2"},"3":{"0":"image44.jpg","1":"texthere","2":"3"},"4":{"0":"image34.jpg","1":"texthere","2":"4"},"5":{"0":"image33.jpg","1":"texthere","2":"5"},"6":{"0":"image21.jpg","1":"texthere","2":"6"},"7":{"0":"image32.jpg","1":"texthere","2":"7"},"8":{"0":"image13.jpg","1":"texthere","2":"8"},"9":{"0":"image11.jpg","1":"texthere","2":"9"},"10":{"0":"image03.jpg","1":"texthere","2":"10"},"length":"12"};

function getArray(object){
     var array = [];
     for(var key in object){
        var item = object[key];
        array[parseInt(key)] = (typeof(item) == "object")?getArray(item):item;
     }
     return array;
}

var dataArray = getArray(dataObject);
于 2012-04-12T10:53:48.980 に答える
0

私が考える最も簡単な方法は、正規表現を使用して JSON をオブジェクト リテラルから配列リテラルに変換することです。

残念ながら、Simon Cowell はこのアプローチよりも魔法のようです。

//I don't know why you don't want a custom function.
function dataToArray(data)
{
    data = data.replace(/"[0-9]+":/g,"");          //Remove all index keys
    data = data.replace(/,"length":"[0-9]+"/g,""); //Remove length key-value pair
    data = data.replace(/{/g,"[");                 //Change the left brackets
    data = data.replace(/}/g,"]");                 //Change the right brackets

    return JSON.parse(data);
}
于 2012-04-12T10:29:47.590 に答える