美好的一天,我正在尝试根据字典值对 JSON 数组进行排序。在序列化之前,字典是按字母顺序显示的,这是正确的,但是一旦序列化,数组就会根据字典的Key进行排序。一个例子是:
{[692:"!Entry1"]}, {[5:"!Entry2"]}, {[75:"!Entry3"]}
排序为
{[5:"!Entry2"]}, {[75:"!Entry3"]}, {[692:"!Entry1"]}
请提供任何帮助
美好的一天,我正在尝试根据字典值对 JSON 数组进行排序。在序列化之前,字典是按字母顺序显示的,这是正确的,但是一旦序列化,数组就会根据字典的Key进行排序。一个例子是:
{[692:"!Entry1"]}, {[5:"!Entry2"]}, {[75:"!Entry3"]}
排序为
{[5:"!Entry2"]}, {[75:"!Entry3"]}, {[692:"!Entry1"]}
请提供任何帮助
那不是有效的 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
属性给出值。
我知道这个问题很老,但我在寻找类似的解决方案时遇到了它。我最终创建了一个函数,该函数基于一个键在 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;
}
欢迎任何人使用它。如果有任何问题,请告诉我。
不能依赖对象内键的确切顺序。
如果你想保留顺序,你的结构应该是这样的:
[{692:"!Entry1"}, {5:"!Entry2"}, {75:"!Entry3"}]