使用js数组方法遇到的坑

sort方法

sort方法用来对数组元素进行排序。可是浏览器实现可能有不一样,已经两次踩到坑了,所以记录一下。chrome

规范

ecma-262制定的排序规则:
使用两个参数x和y唤起排序数组

一、若是x、y都是undefined,返回 +0
二、若是x为undefined,返回 1
三、若是y未undefined,返回 -1
四、若是定义了排序方法浏览器

a、设v = ToNumber(comparefn(x, y))
b、若是v是NaN,返回 +0
c、返回v

五、设xString = ToString(x)
六、设yString = ToString(y)
七、若是xString < yString,返回 -1
八、若是yString < xString,返回 1
九、返回 +0
当返回1的时候,x应排在y后面
返回0的时候,x、y位置不变
返回-1的时候,x应排在y前面函数

坑1:排序不必定是稳定的,即相等的两个元素不必定会保持在原来的位置。排序方法返回0的两个元素仍可能交换位置,如chrome浏览器的排序实现,在数组长度小于等于10的时候就使用插入排序法,没有什么问题,可是数组大于10的时候就会使用快速排序,在比较起始值和中值的时候,排序方法返回值大于和等于0的时候都会对调位置。
我遇到的状况是,须要对会员卡数组进行两个维度的比较排序,数组元素对象可能包含次卡或者折扣属性,次卡排在折扣卡前面,折扣卡按折扣大小排序。当时我写的排序方法为:(a, b) => { return (a.discount && b.times) || a.discount > b.discount },后来发现有时次卡没有排在折扣卡前面,改成:(a, b) => { if ((a.discount && b.times) || a.discount > b.discount) return 1; return -1; })测试

坑2:如上面排序规则第4条a,按标准须要把排序方法返回值转为Number类型,可是有些浏览器版本如Safari10并无实现这一步,若是排序方法返回true/false布尔值而不是Number类型,元素位置就不会进行调整。code

every方法

every方法测试一个数组内的全部元素是否都能经过某个指定函数的测试。结果会返回一个布尔值,直觉认为空数组会返回false对象

callbackfn should be a function that accepts three arguments and
returns a value that is coercible to the Boolean value true or false.
every calls callbackfn once for each element present in the array, in
ascending order, until it finds one where callbackfn returns false. If
such an element is found, every immediately returns false. Otherwise,
if callbackfn returned true for all elements, every will return true.
callbackfn is called only for elements of the array which actually
exist; it is not called for missing elements of the array

如规范解释,every方法对数组中的每个元素(排除空元素)经过指定的函数进行检测,当有某一个元素检测为false的时候,every方法马上返回false,也只有这种状况会返回false,那么空数组就会返回true!排序

相关文章
相关标签/搜索