【发布时间】:2012-06-01 07:23:20
【问题描述】:
前注:我在这里没有使用 jQuery 或其他库,因为我想了解我写的内容以及它为什么有效(或无效),所以请不要用库或库插件回答这个问题。我不反对库,但对于这个项目,它们不利于我的编程目标。
也就是说……
在http://meyerweb.com/eric/css/colors/ 上,我使用自己编写的 DOM 函数添加了一些列排序。问题是,虽然它非常适用于对字符串进行字母排序的简单情况,但当我尝试对多个数字项进行排序时,结果在浏览器中不一致——实际上,当我尝试使用两个子排序进行排序时。
例如,如果您在 OS X 上的 Safari 或 Firefox 中单击“十进制 RGB”几次,您会得到我想要的结果。在 Chrome 或 Opera(同样是 OS X)中做同样的事情,你会得到非常不同的结果。是的,Safari 和 Chrome 在这里有所不同。
这是我用于 RGB 排序的 JS 的 sn-p:
sorter.sort(function(a,b){
return a.blue - b.blue;
});
sorter.sort(function(a,b){
return a.green - b.green;
});
sorter.sort(function(a,b){
return a.red - b.red;
});
(sorter 是我要排序的数组。)
排序是按照另一个 StackOverflow 问题“How does one sort a multi dimensional array by multiple columns in JavaScript?”和its top answer 的传统进行的。然而,我最初试用的四种浏览器中的两种浏览器的结果都不是我所期望的。
我排序(哈哈!)这与数组排序“不稳定”有关——这里没有争论!——但我不知道如何以一致、可靠的方式克服它。我真的可以使用一些帮助来理解问题和查看解决方案,或者至少是解决方案的一般描述。
我意识到可能有六百万种方法可以优化 JS 的其余部分(是的,我使用了全局)。我仍然是 JS 新手,并试图通过实践来纠正这一点。现在,让我感到困惑的是数组排序,在继续清理其他地方的代码之前,我可以使用该脚本的一些帮助。提前致谢!
更新
除了下面的解释和建议之外,我还得到了一个更紧凑的解决方案:
function rgbSort(a,b) {
return (a.red - b.red || a.green - b.green || a.blue - b.blue);
}
尽管我还不太了解它,但我想我已经开始掌握它的轮廓了,这就是我现在正在使用的东西。感谢大家的帮助!
【问题讨论】:
-
你可以在 javascript en.wikipedia.org/wiki/Category:Stable_sorts 中实现一个稳定的排序。
-
也许如果你能做一些事情,比如用一些额外的唯一标签(比如数字)来增加正在排序的元素,那将会有所帮助。然后你可以确保你总是偏向一个特定的方向。也就是说,如果您给每种颜色一个“索引”属性,并按初始排序增加,那么只要两个红色/绿色/蓝色值相等,您就会按第二个“索引”值排序。
-
我不得不补充说,如果您真的是 那个 Eric A. Meyer :-),能够为您提供帮助是我的荣幸
-
Li0liQ: 你有什么特别稳定的推荐吗?我不想花一个小时来实现一个,然后发现它是有史以来效率最低的排序,或者其他什么。
-
我会尝试一个 jsfiddle,看看我的建议是否会有所帮助。 (此外,我并不是故意要给人留下一个傻瓜的印象;我很乐意帮助每个人,不管是不是“互联网传奇”:-)
标签: javascript arrays dom sorting