防止在Javascript中使用for进行循环排序

Prevent sorting with for-in loop in Javascript

本文关键字:for 循环 排序 Javascript      更新时间:2023-09-26

我有以下按类型(而不是ID)排序的JSON数组。

var response = {"5":"Contacts","2":"Messages","3":"Profiles","1":"Schools","4":"Statistics"};
for (var key in response) {
    alert(key + ' ' + response[key]);
}

我希望订单保持原样,但现在的情况是,它正在按ID进行排序,以便首先产生"1所学校"。如何防止for在循环中按关键字排序?

我意识到循环中的for不能保证排序顺序,那么我该如何解决这个问题呢?我需要访问密钥和类型。我是否应该使用不同类型的数组和/或循环?

此外,为了进一步澄清,如果有区别的话,我的实际代码中的JSON数组来自PHP使用JSON_encode的AJAX请求。

您没有数组,您有一个对象。javascript不能保证对象中的密钥排序。如果你想要一个排序的集合,你应该使用一个实际的数组:

var response = [{"key":"5", "value":"Contacts"},{"key":"2", "value":"Messages"},{"key":"3", "value":"Profiles"},{"key":"1", "value":"Schools"},{"key":"4", "value":"Statistics"}];
for (var i =0; i < response.length; i++) {
    alert(response[i].key + ' ' + response[i].value);
}

如何防止for在循环中按关键字排序?

你不能。迭代顺序是未指定的,并且实现依赖于1。如果需要按预定义的顺序遍历数据,请改用数组。


1:大多数流行的浏览器都会按升序迭代数字属性,然后按插入顺序迭代非数字属性,但这也是一个实现细节。

如果您没有访问服务器的权限,但密钥的顺序是有保证的,您可以尝试以下操作:

按照你想要的顺序映射密钥,并以此方式循环

var response = {"5":"Contacts","2":"Messages","3":"Profiles","1":"Schools","4":"Statistics"};
var map = ["5","2","3","1","4"]; 
for(var i = 0; i < map.length;i++){
    alert(i+' '+response[map[i]])
}