我有一个REST api,它将语言环境列表作为字典返回:
{
"en-uk": "English UK",
"en-us": "English USA",
...
}
此词典按值按字母顺序排序。
当AngularJS通过HTTP接收它时,字典会按键自动重新排序,因此当我绑定到select元素时,选项列表按键排序,按字母顺序排列的字符顺序与价值,我的排序错误。
我想这个问题是因为这样的字典基本上变成了一个具有800多个属性的对象。我如何按价值排序?
答案 0 :(得分:1)
首先:您必须找到所有密钥。
第二::迭代所有密钥。
第三:然后使用值对数组进行排序。
请使用以下内容:
let obj = {
"en-us": "English USA",
"en-uk": "English UK"
};
// Get an array of the keys:
let keys = Object.keys(obj);
// Then sort by using the keys to lookup the values in the original object:
keys.sort(function(a, b) { return obj[a] > obj[b] });
console.log(keys);
console.log(obj[keys[0]]);

答案 1 :(得分:0)
您可以修改从服务器发送响应的方式。不是将响应作为对象发送,而是发送字符串化对象。
答案 2 :(得分:0)
问题确实是您无法对对象属性的值进行排序。所以我在绑定它之前将它转换为数组:
所以,
languageResource.getCultures().then(function(cultures) {
vm.availableCultures = cultures;
});
变为
languageResource.getCultures().then(function (culturesDictionary) {
var cultures = [];
angular.forEach(culturesDictionary, function (value, key) {
cultures.push({
lcid: key,
name: value
});
});
vm.availableCultures = cultures;
});
答案 3 :(得分:0)
当键是数字时看到这个。如果键的数据类型是字符串,那么它会在 API 调用后保持其排序状态。如果键的数据类型是数字,则您需要将键的值设置为字符串,甚至在 API 将其发回之前,甚至在键的值前后添加单引号。
我还没有尝试过在 API 中字符串化字典的方法。调用后,您可以使用 JSON.parse(string) 之类的内容将字符串解析回对象。