排序基于密钥的JSON数组
好日子,我想排序基于字典值的JSON数组。 在序列化之前,字典按照字母顺序显示,这是正确的,但是一旦序列化,数组将根据字典Key进行排序。 一个例子是:排序基于密钥的JSON数组
{[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都没有办法对条目的值排序基本类型(数组或objets)。
在JSON(或JavaScript),你可以这样做:
[{"692":"!Entry1"}, {"5":"!Entry2"}, {"75":"!Entry3"}]
...它代表对象的数组,其中每个对象都有一个名称的属性一样"75"
具有价值给你“入口”字符串。但它很难很难。
另一种方式是:
[
{key: "692", value: "!Entry1"},
{key: "5", value: "!Entry2"},
{key: "75", value: "!Entry3"}
]
哪个是对象的数组,其中每个对象具有一个key
属性给出密钥,以及value
属性给出的值。
不能依赖对象内部按键的确切顺序。
如果你想保留的顺序,你的结构应该是这样的:
[{692:"!Entry1"}, {5:"!Entry2"}, {75:"!Entry3"}]
这也是不是有效的JSON(尽管它是有效的JavaScript),并且非常难以使用(正如我在答案中指出的那样)。 – 2013-05-06 08:36:58
@ T.J.Crowder是的,我故意使用术语“结构”而不是有效的JSON表示法:) – 2013-05-06 08:40:37
@ Jack::-) ...... – 2013-05-06 08:52:17
我知道这个问题是旧的,但我碰到它,而寻找一个类似的解决方案。我最终创建了一个函数,它根据一个键对一组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;
}
任何人,欢迎使用。让我知道是否有任何问题。
这不是有效的json。 – 2013-05-06 08:27:31
使用http://www.jsonlint.org检查有效的json – 2013-05-06 08:30:06