-2

美好的一天,我正在尝试根据字典值对 JSON 数组进行排序。在序列化之前,字典是按字母顺序显示的,这是正确的,但是一旦序列化,数组就会根据字典的Key进行排序。一个例子是:

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

排序为

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

请提供任何帮助

4

3 回答 3

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 回答
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 回答
0

不能依赖对象内键的确切顺序。

如果你想保留顺序,你的结构应该是这样的:

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