-2

こんにちは、辞書値に基づいて JSON 配列をソートしようとしています。シリアライズ前は正しいアルファベット順でディクショナリが表示されますが、シリアライズ後はディクショナリ Key に基づいて配列がソートされます。例は次のとおりです。

{[692:"!Entry1"]}, {[5:"!Entry2"]}, {[75:"!Entry3"]}

としてソートされます

{[5:"!Entry2"]}, {[75:"!Entry3"]}, {[692:"!Entry1"]}

助けてください

4

3 に答える 3

1

この質問は古いことは知っていますが、同様の解決策を探しているときに出くわしました。キーに基づいて JSON オブジェクトの配列全体で挿入ソートを実行する関数を作成することになったので、この機能が必要な人のために共有したいと思いました。コードは次のとおりです。パラメーター 'isGreatestToLeast' (ブール値) に応じて、最大から最小、または最小から最大の順で機能します。

/**
 * Performs an insertion sort on an array of json object based on a specified key
 * @param jsonArray - an array of json objects
 * @param key - the name of the key that should be used to determine the value
 * @param isGreatestToLeast - boolean, is the sort least to greatest or greatest to least?
 * @returns {array} of objects
 */
function insSortJsonArr(jsonArray, key, isGreatestToLeast){

    for(var i = 1; i < jsonArray.length; i++){

        var next = jsonArray[i];
        var j = i;

        if(isGreatestToLeast){

            while(j > 0 &&  next[key] >  jsonArray[j - 1][key]){

                jsonArray[j] = jsonArray[j - 1];
                j--;
            }
        } else{

            while(j > 0 &&  jsonArray[j - 1][key] < next[key]){

                jsonArray[j] = jsonArray[j - 1];
                j--;
            }
        }

       jsonArray[j] = next;
    }
    return jsonArray;
}

どなたでもご利用いただけます。ご不明な点がございましたら、お知らせください。

于 2015-08-22T04:29:02.367 に答える
1

これは有効な JSON ではありません。有効な場合は配列ではなく、オブジェクトになります。オブジェクトはソートされません。

配列の場合、スパースになります。JSON には、まばらな配列を表す方法がありません。

JavaScript (jQuery は不要) では、そのスパース配列を次のように表現できます。

var a = [];
a[692] = "!Entry1";
a[5]   = "!Entry2";
a[75]  = "!Entry3";

しかし、ご指摘のとおり、値ではなくキーでソートされます (例: 、"!Entry2""!Entry3") "!Entry1"

JSON にも JavaScript にも、基本型 (配列またはオブジェクト) をエントリの値で並べ替える方法はありません。

JSON (または JavaScript) では、次のようにすることができます。

[{"692":"!Entry1"}, {"5":"!Entry2"}, {"75":"!Entry3"}]

...オブジェクトの配列を表します。各オブジェクトには、"75"「エントリ」文字列を与える値を持つような名前のプロパティがあります。しかし、それを扱うのは非常に難しいでしょう。

別の方法は次のとおりです。

[
    {key: "692", value: "!Entry1"},
    {key: "5",   value: "!Entry2"},
    {key: "75",  value: "!Entry3"}
]

これはオブジェクトの配列で、各オブジェクトにはkeyキーを与えるvalueプロパティと値を与えるプロパティがあります。

于 2013-05-06T08:29:13.620 に答える
0

オブジェクト内のキーの正確な順序は信頼できません。

順序を維持したい場合、構造は次のようになります。

[{692:"!Entry1"}, {5:"!Entry2"}, {75:"!Entry3"}]
于 2013-05-06T08:34:13.187 に答える