使用自定义订单

时间:2017-07-11 22:41:16

标签: javascript arrays mongodb sorting

这源于how to sort array inside collection record in mongoDB

提供的示例
> alit=[{a:16},{a:15},{a:14},{a:13},{a:12},{a:11},{a:10},{a:9},{a:8},{a:7},{a:6},{a:5},{a:4},{a:3},{a:2},{a:1},{a:0}]
> alit.sort(function(a,b) {return a.a>b.a } ) 
[ { "a":8 }, { "a":0 }, { "a":7 }, { "a":14 }, { "a":12 }, { "a":11 }, { "a":10 }, { "a":9 }, { "a":1 }, { "a":13 }, { "a":6 }, { "a":5 }, { "a":4 }, { "a":3 }, { "a":2 }, { "a":15 }, { "a":16 } ] 
>

请注意,如果我多次执行同一行,它会越来越多地逐步排序,就好像这是执行快速排序但每次只有两级递归。 任何人都可以解释我做错了什么,以及如何定义一次扫描的自定义订单?

1 个答案:

答案 0 :(得分:0)

问题在于您在数组排序中使用的自定义比较功能。

较旧版本的JavaScript引擎(例如,MongoDB 3.0和早期shell中使用的那些)期望自定义比较函数将返回三个数值中的一个:正数(大于),零(相等)或负数(小于比)。返回布尔值的比较函数具有未定义的结果(尽管合理地期望它们应该被强制转换为它们的数字等价物),因此结果取决于JavaScript引擎。

您应该使用返回数值的函数获得预期结果。

例如,这应该适用于mongo shell的所有版本:

 alit.sort(function(a,b) {return a.a - b.a } )

注意:mongo 3.2或更新版本中使用的更现代的SpiderMonkey引擎使用>正确处理排序,因此您的原始自定义sort()将在最新版本的shell中按预期工作。