JavaScript Array#sort()函数使用哪种算法?我知道它可以采取各种各样的参数和函数来执行不同类型的排序,我只是对vanilla排序使用哪种算法感兴趣.
我正在寻找一个大约200-300个对象的数组,对特定的键和给定的顺序(asc/desc)进行排序.结果的顺序必须一致且稳定.
什么是最好的算法,你能提供一个在javascript中实现它的例子吗?
谢谢!
我有一个非常简单的JSON对象,如下所示:
{
"people":[
{
"f_name":"john",
"l_name":"doe",
"sequence":"0",
"title":"president",
"url":"google.com",
"color":"333333"
},
{
"f_name":"michael",
"l_name":"goodyear",
"sequence":"0",
"title":"general manager",
"url":"google.com",
"color":"333333"
}
]
}
Run Code Online (Sandbox Code Playgroud)
现在,这是从我的服务器端代码返回的,我运行jQuery.each以形成必要的html并输出结果.
现在我正在做的是向包含我的排序信息的服务器发送一个AJAX调用...例如"Title DESC"并重新运行SQL查询以返回新的结果集.但我想避免这种情况,并使用jQuery对生成的JSON进行排序,以防止往返服务器和多个数据库访问.
我怎样才能使用jQuery实现这一目标?
我想检查一个数组是否包含"role".如果是这样,我想移动"role"到数组的前面.
var data= ["email","role","type","name"];
if ("role" in data) data.remove(data.indexOf("role")); data.unshift("role")
data;
Run Code Online (Sandbox Code Playgroud)
在这里,我得到了结果:
["role", "email", "role", "type", "name"]
我怎样才能解决这个问题?
我一直在网上寻找一段时间,我想知道是否存在通常使用的快速排序的"稳定"事实实现?我可以写自己的,但为什么重新发明轮子......
我最近阅读了很多关于JavaScript排序的答案,我经常偶然发现一个比较函数,如下所示:
array.sort(function(a,b){ a > b ? 1 : -1; });
Run Code Online (Sandbox Code Playgroud)
所以它是一个比较函数,如果a大于则返回1,如果小于OR EQUAL TO b则返回-1 .如MDN(链接)所述,比较函数也可以返回零,以确保两个项目的相对位置保持不变:ab
如果compareFunction(a,b)返回0,则保持a和b相对于彼此保持不变,但是对于所有不同的元素进行排序.
所以官方的例子看起来更像是这样的:
function compare(a, b) {
if (a < b) return -1;
if (a > b) return 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
实际上,通过添加return 0语句,排序算法通常需要更少的迭代并且总计运行得更快(JSPerf).
所以我想知道在省略return 0声明方面是否有任何优势.
我意识到在MDN上,它还说:
注意:ECMAscript标准不保证这种行为,因此并非所有浏览器(例如可追溯到至少2003年的Mozilla版本)都尊重这一点.
指的是行为,这a和b如果返回0应保持不变.那么也许,通过返回0,我们在不同的浏览器中得到一个稍微不同的排序数组?这可能是个原因吗?是否有任何其他充分理由不返回零?
您如何以随机顺序订购AngularJS中的项目列表?我认为内置orderBy过滤器可以工作,但我不确定如何不向模型添加一些额外的数据.类似的东西会很棒.
item in items | orderBy:random
Run Code Online (Sandbox Code Playgroud)
我的下一个想法是创建一个自定义过滤器,但如果有更好的东西,我宁愿避免这种情况.
UP-FRONT注意:我没有在这里使用jQuery或其他库,因为我想了解我写的是什么以及为什么它可以工作(或不工作),所以请不要用图书馆的库或插件来回答这个问题.我没有反对库,但对于这个项目,它们对我的编程目标不利.
那说......
在http://meyerweb.com/eric/css/colors/上我添加了一些使用我自己编写的DOM函数的列排序.问题是,虽然它对于字母串字符串的简单情况很有用,但当我尝试对多个数字项进行排序时,结果在浏览器中不一致 - 实际上,当我尝试使用两个子排序进行排序时.
例如,如果您在OS X上的Safari或Firefox中单击"十进制RGB"几次,您将获得我想要的结果.在Chrome或Opera(再次,OS X)中执行相同操作,您会得到截然不同的结果.是的,Safari和Chrome在这里有所不同.
这是我用于RGB排序的JS的片段:
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;
});
Run Code Online (Sandbox Code Playgroud)
(sorter作为我正在尝试排序的数组.)
排序是在另一个StackOverflow问题的传统中完成的" 如何通过JavaScript中的多列对多维数组进行排序?" 及其最佳答案.然而,结果并不是我最初尝试的四种浏览器中的两种.
得到(ha!)得到这与数组排序"不稳定"有关 - 这里没有参数! - 但我不知道的是如何以一致,可靠的方式克服它.我真的可以使用一些帮助来理解问题和看到解决方案,或者至少是解决方案的一般描述.
我意识到可能有六百万种方法来优化JS的其余部分(是的,我使用了全局).我仍然是一个JS新手,并试图通过练习纠正它.现在,它的数组排序让我感到困惑,我可以使用该脚本的一些帮助,然后继续清理其他地方的代码.提前致谢!
UPDATE
除了下面的重要解释和建议外,我还得到了一个更紧凑的解决方案:
function rgbSort(a,b) {
return (a.red - b.red || a.green - b.green || a.blue - b.blue);
}
Run Code Online (Sandbox Code Playgroud)
即使我还不太了解它,我想我已经开始掌握它的轮廓,这就是我现在正在使用的.感谢大家的帮助!
这是一个老问题,我认为如果我们在这里收集最新数据会有所帮助.请点击这个小提琴
并分享您的结果.
小提琴代码:
a = []
for(var i = 0; i < 1000; i++) {
a.push({'key':100 + Math.round(Math.random() * 100), 'val': i + 1000 })
}
a.sort(function(x, y) { return x.key - y.key })
b = []
for(var i = 0; i < 1000; i++) {
b.push(a[i].key * 10000 + a[i].val);
}
c = b.slice(0)
b.sort()
stable = (b.join() === c.join())
document.body.innerHTML = navigator.userAgent.toString() + "<br>" + (stable ? "stable": "UNSTABLE")
Run Code Online (Sandbox Code Playgroud) 我是一个javascript新手,这是来自ExtJS的代码让我感到困惑:
supportsSort = (function() {
var a = [1,2,3,4,5].sort(function(){ return 0; });
return a[0] === 1 && a[1] === 2 && a[2] === 3 && a[3] === 4 && a[4] === 5;
}()),
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我为什么ExtJS想要做这个测试吗?
最好附上一些示例代码.