如何订购以JSON格式返回的商品?

时间:2015-09-11 21:43:04

标签: javascript json sorting

我想按字符串值(不是键号)对以下信息进行排序。我可以将它转换为字典并按下面的代码中的值(“AAA”和“CCC”)排序...现在唯一的问题是,如何在parseJSON函数中将字典转换为下面相同的格式?我不能改变JSON的格式,所以这是不可能的。任何其他方式表示赞赏。我不能将它移动到数组或任何东西。正如我的问题所述,JSON格式按原样存在,我无法更改它。

   var studentCollection.Groups = $.parseJSON("{\"1000\":\"CCC\", \"1001\":\"AAA\"}");

    //Sorting the studentCollection.Groups dictionary. 
    //Even though the groups come back as valid/sorted JSON
    //upon parsing the JSON, the groups sorting gets lost
    var items = Object.keys(studentCollection.Groups).map(function (key) {
        return [key, studentCollection.Groups[key]];
    });

    items.sort(function (first, second) {

        if (first[1] < second[1])
            return -1;
        if (first[1] > second[1])
            return 1;
        return 0;

    });

2 个答案:

答案 0 :(得分:1)

您只需将对象值转换为要排序的数组,然后再逐步分配给对象:

    var j = "{\"1000\":\"AAA\", \"1001\":\"ZZZ\"}";
    var o = JSON.parse(j);

    var keys = Object.keys(o);
    var values = [];

    for(var i = 0; i < keys.length; i++) values.push(o[keys[i]]);

    values.sort();

    for(var i = 0; i < values.length; i++) o[keys[i]] = values[i];

    alert( JSON.stringify(o) );

更新

因为上面的示例没有保持按键基本顺序,所以:

    var j = "{\"1000\":\"AAA\", \"1002\":\"ZZZ\", \"1004\":\"DDD\", \"1003\":\"BBB\", \"1001\":\"YYY\"}";

    j = j.replace(/\"\d+\"\:/g, function myFunction(x){ return x.substring(0,1) + "_" + x.substring(1) })

    var o = JSON.parse(j);

    var keys = Object.keys(o);
    var values = [];

    for(var i = 0; i < keys.length; i++) values.push(o[keys[i]]);

    values.sort();

    for(var i = 0; i < values.length; i++) o[keys[i]] = values[i];

    var j = JSON.stringify(o)

    j = j.replace(/\"\_\d+\"\:/g, function myFunction(x){ return x.substring(0,1) + x.substring(2) })

    alert( j );

在此处尝试:https://jsfiddle.net/pyqw8hvt/1/

这个想法是在每个整数键之前添加_以使其成为非整数,并以这种方式避免在解析对象内部自动排序,然后在对象字符串后擦除添加的_内部键

答案 1 :(得分:1)

我不知道这是否是最佳方式,您必须两次调用JSON.stringify,但它会提供您正在寻找的输出:

var studentCollection = {};
studentCollection.Groups = $.parseJSON("{\"1000\":\"CCC\", \"1001\":\"AAA\"}");

var items = Object.keys(studentCollection.Groups).map(function (key) {
    return [key, studentCollection.Groups[key]];
});

items.sort(function (first, second) {
    if (first[1] < second[1])
        return -1;
    if (first[1] > second[1])
        return 1;
    return 0;
});

result = JSON.stringify(JSON.stringify(toObject(items)))
console.log(result);
// outputs: "{\"1001\":\"AAA\",\"1000\":\"CCC\"}"

// checking if ordering remains
console.log($.parseJSON(result));
// outputs: {"1001":"AAA","1000":"CCC"}

function toObject(arr) {
    return arr.reduce(function(o, v, i) {
        o[v[0]] = v[1];
        return o;
    }, {});
}