Javascript 如何订购以JSON格式返回的项目?

Javascript 如何订购以JSON格式返回的项目?,javascript,json,sorting,Javascript,Json,Sorting,我想按字符串值(而不是键号)对以下信息进行排序。我能够将其转换为字典,并按以下代码中的值(“AAA”和“CCC”)排序。。。现在唯一的问题是,如何在parseJSON函数中将字典转换为下面相同的格式?我无法更改JSON的格式,所以这是不可能的。任何其他方式都很感激。我无法将其移动到数组或其他任何位置。如我在问题中所述,JSON格式按原样存在,我无法更改它 var studentCollection.Groups = $.parseJSON("{\"1000\":\"CCC\", \"100

我想按字符串值(而不是键号)对以下信息进行排序。我能够将其转换为字典,并按以下代码中的值(“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;

    });
var studentCollection.Groups=$.parseJSON(“{\'1000\':\'CCC\',\'1001\':\'AAA\'”);
//对studentCollection.Groups字典进行排序。
//即使组返回为有效/已排序的JSON
//解析JSON后,组排序将丢失
var items=Object.keys(studentCollection.Groups).map(函数(键){
返回[key,studentCollection.Groups[key]];
});
items.sort(函数(第一、第二){
如果(第一[1]<第二[1])
返回-1;
如果(第一个[1]>第二个[1])
返回1;
返回0;
});

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

    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\”,“1001\”:“ZZZ\”}”;
var o=JSON.parse(j);
var keys=Object.keys(o);
var值=[];
对于(var i=0;i

更新

由于上述示例未保持钥匙基本顺序,因此该示例应:

    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 );
var j=“{\'1000\”:“AAA\”,“1002\”:“ZZZ\”,“1004\”:“DDD\”,“1003\”:“BBB\”,“1001\”:“YYY\”;
j=j.replace(/\“\d+\”\:/g,函数myFunction(x){返回x.substring(0,1)+“\+x.substring(1)})
var o=JSON.parse(j);
var keys=Object.keys(o);
var值=[];
对于(var i=0;i
请在此处尝试:


想法是在每个整数键之前添加uu,使其成为非整数,这样可以避免在已解析的对象内自动排序,然后在对对象进行字符串化后删除添加的uuu内部键

我不知道这是否是最好的方法,您必须调用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;
    }, {});
}
var studentCollection={};
studentCollection.Groups=$.parseJSON(“{\'1000\':\'CCC\',\'1001\':\'AAA\'”);
var items=Object.keys(studentCollection.Groups).map(函数(键){
返回[key,studentCollection.Groups[key]];
});
items.sort(函数(第一、第二){
如果(第一[1]<第二[1])
返回-1;
如果(第一个[1]>第二个[1])
返回1;
返回0;
});
结果=JSON.stringify(JSON.stringify(toObject(items)))
控制台日志(结果);
//输出:“{\“1001\”:“AAA\”,“1000\”:“CCC\”}”
//检查是否还有订单
log($.parseJSON(result));
//输出:{“1001”:“AAA”,“1000”:“CCC”}
函数对象(arr){
返回arr.reduce(函数(o、v、i){
o[v[0]]=v[1];
返回o;
}, {});
}

您是否在询问如何将存储在
项中的多维数组转换回对象?您为什么关心对象的排序?根据定义,对象属性没有有意义的“顺序”。问题的可能重复之处在于,如果将排序后的数组转换回对象,因为对象没有顺序,所以它将毫无用处。所以要么对数组进行字符串化,要么构建自己的JSON字符串化器。我必须给这个函数的调用者一个排序对象(不是字典或数组)。我不制定规则,我只是遵循规则。对象的属性顺序只对某些方法(例如,
object.keys
,也仅在ES6中)有保证,并且几乎仅限于非数字键(您没有)。没有“有序/排序对象”的概念。如果您通常使用
中为…迭代对象,则无法保证顺序。您能否澄清
JSON.stringify
如何确定对象属性的顺序?为什么?它只用于将“排序”对象转换回JSON,为什么会是什么?我在问
JSON.stringify
如何迭代对象属性进行序列化。编辑:或者我错误地假设OP希望得到JSON作为结果…问题是在您的示例中,“属性名”(“1000”,“1001”)也是有序的。。。我希望属性名称不排序,属性值不排序。@KeyvanSadralodabai Javascript不指定任何关于对象中属性顺序的内容。如果想要元素的特定顺序,可以使用数组,而不是对象。对,但是当我从JSON转换回object时,它会丢失排序。我编辑了“$.parseJSON(result)”,它不会对我拥有的大对象保持排序。众所周知,$.parseJSON并没有保持JSON字符串的顺序。您可以向我们提供该对象,或者至少提供一个它不起作用的示例,方法是将它包含在您的问题中,或者提供一个JSFIDLE?