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