JavaScript Sort 的一个错误用法示例

 这篇文章主要介绍了JavaScript Sort 的一个错误用法示例,本文分析了一个Sort实例得到了这个错误用法并给出了解决方法,需要的朋友可以参考下

 
 

前不久同事的代码中出了一个很神奇的问题,大致流程是对一个由对象组成的数组进行排序,其中属性 a 用于排序,属性 b 作为一个优选条件,当 b 等于 1 的时候无论 a 值是什么,都排在开头 。这本是一个很简单的问题,问题就在于他用两次 sort 实现在这次排序,先根据 a 的属性排序,然后再根据 b 的值来排序。问题就出在第二次排序中。

我们想当然的会认为在第一次排序中,数组已经根据 a 的属性由大到小排序,在第二次中我们只要不去动原数组的顺序就行(一般在方法中写成返回0或-1),只考虑单独把 b 等于 1 的元素提到前面去。但是其实这与语言所选用的排序算法有关,javascript (和一起其他语言)内置的 sort 方法采用的是几种排序算法的集合,有时并不能保证相同元素的位置保持一致。

下面是从 stackoverflow 上面找来的一个例子

 

代码如下:

var arrayToSort = [
{name: 'a', strength: 1}, {name: 'b', strength: 1}, {name: 'c', strength: 1}, {name: 'd', strength: 1},
{name: 'e', strength: 1}, {name: 'f', strength: 1}, {name: 'g', strength: 1}, {name: 'h', strength: 1},
{name: 'i', strength: 1}, {name: 'j', strength: 1}, {name: 'k', strength: 1}, {name: 'l', strength: 1},
{name: 'm', strength: 1}, {name: 'n', strength: 1}, {name: 'o', strength: 1}, {name: 'p', strength: 1},
{name: 'q', strength: 1}, {name: 'r', strength: 1}, {name: 's', strength: 1}, {name: 't', strength: 1}
];

 

arrayToSort.sort(function (a, b) {
return b.strength - a.strength;
});

arrayToSort.forEach(function (element) {
console.log(element.name);
});

 

我们会以为最后元素的值还是从 a 到 t,但实际运行下来的结果却是乱序的,这是因为 sort 的算法并没有保留原数组的顺序,也即 unstable。

那么我们就该尽量避免这种情况发生,就我同事的例子,将两次 sort 的逻辑合并在一次中应该是个可行的办法,如果必须分为多次 sort,那么就把原数组的顺序记录在元素的属性上把。

时间: 2024-10-03 19:25:04

JavaScript Sort 的一个错误用法示例的相关文章

JavaScript Sort 的一个错误用法示例_javascript技巧

前不久同事的代码中出了一个很神奇的问题,大致流程是对一个由对象组成的数组进行排序,其中属性 a 用于排序,属性 b 作为一个优选条件,当 b 等于 1 的时候无论 a 值是什么,都排在开头 .这本是一个很简单的问题,问题就在于他用两次 sort 实现在这次排序,先根据 a 的属性排序,然后再根据 b 的值来排序.问题就出在第二次排序中. 我们想当然的会认为在第一次排序中,数组已经根据 a 的属性由大到小排序,在第二次中我们只要不去动原数组的顺序就行(一般在方法中写成返回0或-1),只考虑单独把

PHP自定义错误用法示例_php技巧

本文实例讲述了PHP自定义错误用法.分享给大家供大家参考,具体如下: 自定义错误就是自己可以完全控制错误以及其提示内容 设定错误由自己定义的函数来处理 set_error_handler('errName'); 设定该函数并在其中自定义错误的输入与记录,自带四个参数 errNo 错误号 errMsg 错误信息 errFile 错误文件 errLine 错误行号 function errName($errNo,$errMsg,$errFile,$errLine){ echo 'errNo:'.$e

Javascript中for in的用法示例解析

 使用js的朋友对其中for in的并不陌生吧,下面用示例为大家介绍下其具体使用方法 for(var i=0;i<len;i++)这样的用法一般都可以用for in 来替代.  例如:  代码如下: var a = ["a","b","c"];  for(var el in a){  alert(a[el]);  }    这个就是穷举出a中的所有元素,当然上面这个例子是可以用  代码如下: for(var i=0,len=a.length

JavaScript中return用法示例_javascript技巧

本文实例讲述了JavaScript中return用法.分享给大家供大家参考,具体如下: return可以接受函数中的返回值,前提是函数中要有return语句. 下面是一个应用小示例: <html> <head> <script type='text/javascript'> function linkPage(){ alert('You Clicked??'); return false; } </script> </head> <body

javascript中call和apply的用法示例分析_javascript技巧

call和apply的用法,并利用call实现js类的继承 /* * 矩形 */ function Rectangle(len,width) { this.len = len; this.width = width; } /* * 乘以 */ function multiply(a,b) { return a * b; } // 矩形实例 var rectangle = new Rectangle(15, 30); //求矩形面积 var proportion = multiply.call(r

JS作为值的函数用法示例_javascript技巧

本文实例讲述了JS作为值的函数用法.分享给大家供大家参考,具体如下: function callSomeFunction(someFunction,someArgument){ return someFunction(someArgument); } 这个函数接受两个参数,第一个函数应该是一个函数,第二个参数应该是要传递给该函数的一个值.该函数是通用的. 如: function add10(num){ return num+10; } var result = callSomeFunction(

避免常见的六种HTML5错误用法

一.不使用section作为div的替代品 人们在标签使用中最常见到的错误之一就是随意将HTML5的<section>等价于<div>--具体地说,就是直接用作替代品(用于样式).在XHTML或者HTML4中,我们常看到这样的代码: <!-- HTML 4-style code --> <div id="wrapper"> <div id="header"> <h1>My super duper

为AJAX应用程序构建一个错误提交系统

ajax|程序|错误 摘要 当一些应用程序崩溃时,它们往往向用户提供一个机会来提交关于该错误的信息.该信息能够帮助开发者追踪并修正错误.本文将向你展示如何在你的JavaScript/AJAX应用程序中实现这样的功能. 一. 引言 如果可以存取终端用户的计算机的话,那么终端用户的JavaScript错误就很容易调试.既然你不能实现这样的操作,那么你可以采取下面这样的措施:让用户向你发送你修正该问题需要的内容. 当象Mozilla浏览器这样的应用程序崩溃时,它们会启动一个错误提交程序.这些程序将询问

html 中 #include file 的用法示例介绍

 html 中 #include file 的用法示例介绍 有两个文件a.htm和b.htm,在同一目录下a.htm内容如下 代码如下: <!-- #include file="b.htm" --> b.htm内容如下 今天:雨 31 ℃-26 ℃ <br />明天:雷阵雨 33 ℃-27 ℃ 直接在浏览器中打开a,没有任何显示,后来知道,include是SSI(Server Side Include),在html中不支持include,之后把a.htm改成a.