排序基于密钥的JSON数组

问题描述:

好日子,我想排序基于字典值的JSON数组。 在序列化之前,字典按照字母顺序显示,这是正确的,但是一旦序列化,数组将根据字典Key进行排序。 一个例子是:排序基于密钥的JSON数组

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

被分类为

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

任何帮助,请

+6

这不是有效的json。 – 2013-05-06 08:27:31

+0

使用http://www.jsonlint.org检查有效的json – 2013-05-06 08:30:06

这不是有效的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属性给出的值。

+2

“不需要jQuery”:*! – MarioDS 2013-05-06 08:30:41

+0

@MarioDeSchaepmeester ::-) – 2013-05-06 08:32:04

+0

直到有一天浏览器决定数组有固定长度:p – MarioDS 2013-05-06 08:32:42

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

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

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

这也是不是有效的JSON(尽管它是有效的JavaScript),并且非常难以使用(正如我在答案中指出的那样)。 – 2013-05-06 08:36:58

+1

@ T.J.Crowder是的,我故意使用术语“结构”而不是有效的JSON表示法:) – 2013-05-06 08:40:37

+0

@ 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; 
} 

任何人,欢迎使用。让我知道是否有任何问题。