jQuery 每个总是排序吗?

Posted

技术标签:

【中文标题】jQuery 每个总是排序吗?【英文标题】:jQuery each always sort it? 【发布时间】:2012-10-06 12:44:15 【问题描述】:

我在 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

知道如何解决吗?

【问题讨论】:

【参考方案1】:

我碰到你的问题,我花了 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/

【讨论】:

【参考方案2】:

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

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

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


jQuery.each(list, function(i, obj)  
  console.log(i + " - " + obj[0] + " - " + obj[1]);
);

【讨论】:

那么如何禁用排序? @fdrv 你不能,它发生在 OP 上,因为浏览器确实对键的枚举顺序进行了排序,就像现代浏览器一样。除了使用像this answer这样的数组而不是对象之外,您无法通过任何其他方式恢复原始顺序。【参考方案3】:

这是因为 javascript 对象项没有顺序。

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

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

$.each(keys, function(i, key) 
    console.log(key, values[i]);
);

【讨论】:

【参考方案4】:

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

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

Source.

因此,ECMA 实现不必以任何顺序进行迭代。其实顺序不一样in different browsers/versions。

【讨论】:

以上是关于jQuery 每个总是排序吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使输入表单可排序吗?

将参数传递给方法总是在java中从左到右排序吗?

jquery dataTables 插件可以在排序/过滤后尊重备用行颜色吗?

如何在 jQuery 中对选择选项进行排序以同时尊重每个选项数据属性?

堆排序-代码版

jQuery.sort对DOM元素进行排序