12

我在 JS 中有这个对象:

var list = {134 : "A",140 : "B",131 : "C"}

我运行它:

jQuery.each(list, function(key, value) { 
console.log(key + " - " + value);
});

输出应该是:

134 - A
140 - B
131 - C

但我不知道为什么,输出是:

131 - C
134 - A
140 - B

知道如何解决吗?

4

4 回答 4

7

首先:这不是一个列表,它是一个对象。不保证保持对象的顺序 - 每个实现都可以选择不同的顺序。

另一方面,数组确实保持顺序:

var list = [[134, "A"],[140, "B"],[131, "C"]];


jQuery.each(list, function(i, obj) { 
  console.log(i + " - " + obj[0] + " - " + obj[1]);
});
于 2012-10-16T12:10:34.937 回答
5

我碰到你的问题,我花了 10 分钟才明白。

这就是您解决问题的方法:

var list = {134 : "A",140 : "B",131 : "C"};

// 1 - property to list
list = Object.keys(list).map(
    function(key) {
         return { num : key , char : list[key]};;
     });

console.debug(list);
// 2 - sorting the list
var sorted = list.sort(function(a, b) {
            if(a.char < b.char) return -1; return 1;
        });

// 3 output
jQuery.each(sorted, function(index, obj) {      
        console.log(obj.num + " - " + obj.char);
});

JsFiddle:https ://jsfiddle.net/wx38rz5L/1578/

于 2016-08-08T15:46:48.393 回答
4

根据规范,对象的属性没有定义的顺序。

未指定枚举属性 (...) 的机制和顺序。

来源

因此,ECMA 实现不必以任何顺序迭代。实际上,顺序在不同的浏览器/版本中有所不同。

于 2012-10-16T12:08:13.873 回答
4

发生这种情况是因为 JavaScript 对象项没有顺序。

为了修复它,您可以使用两个数组:一个带有键,第二个带有值:

var keys = [134, 140, 131],
    values = ["A", "B", "C"];

$.each(keys, function(i, key) {
    console.log(key, values[i]);
});
于 2012-10-16T12:08:20.800 回答