注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

放飞自由

年轻人,如果三年的时间里,没有任何想法,他这一生,就基本这个样子,没有多大改变。

 
 
 

日志

 
 

javascript 中 对数组array(字符串)排序  

2015-05-30 18:26:45|  分类: WEB前端 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1、对数字进行排序

var arr = [30, 0.3, 22,190, 311, 222];
arr.sort();
// [0.3, 190, 22, 222, 30, 311]     // 很显然结果不是我们想要的

// ---
var arr = [30, 0.3, 22,190, 311, 222];
arr.sort(function(a,b) {
    return a - b;
});
// [0.3, 22, 30, 190, 222, 311]    // 结果正确

2、对字母进行排序

var arr = ['Alert', 'CQ','banana'];
console.info ( arr.sort() );
// ["Alert", "CQ", "banana"]     // 结果与我们预期的不同


// --
var arr = ['alert', 'cQ','banana'];
console.info ( arr.sort() );

// ["alert", "banana", "cQ"] // 似乎是我们想要的结果,往下看

// --
var arr = ['alert', 'cQ2','banana', 'cq1'];
console.info ( arr.sort() );
// ["alert", "banana", "cQ2", "cq1"] // 按理说cQ2应该排在cq1的后面,于是想到数字的比较方式

// ---
var arr = ['alert', 'cQ2','banana', 'cq1'];

console.info ( arr.sort(function(a,b) {
    return a - b;
}) );

["alert", "cQ2", "banana", "cq1"] // 这样也不行

// ---
var arr = ['alert', 'cQ2','banana', 'cq1'];
console.info ( arr.sort(function(a,b) {
    if( a > b) {
        return 1;
    } else if(a < b) {
        return -1;
    } else {
        return 0;
    }
}) );

// ["alert", "banana", "cQ2", "cq1"]     //还是不行
// ---

var arr = ['alert', 'cQ2','banana', 'cq1'];
console.info ( arr.sort(function(a,b) {
    a = a.toLowerCase(), b = b.toLowerCase();
    if( a > b) {
        return 1;
    } else if(a < b) {
        return -1;
    } else {
        return 0;
    }
}) );

//["alert", "banana", "cq1", "cQ2"] // 这才是我们想要的结果,(但对于B2,ba这两个该2在前还是在后需要根据需求在做处理了,这里默认是按照字符编码顺序来的。2->50,a -> 97)

总结:

**说一下我们在这里犯过的几个错误**

> - 操作符 `-` 的错误使用: 直接拿数字的比较方式对字母进行比较, 比如 a - b 的使用。操作数是字符串/boolean/null/undefined时,后台会调用Number()函数将其转化为数字,然后再根据相应的规则执行减法计算,如果转换结果是NaN,则减法结果就是NaN; `if(NaN) {}` 这样的条件永远不成立,则排序就无从谈起了。所以我们该用 `>` 和 `<` 判断。

> - 操作符 `<` 和 `>`的错误使用: 对于数字是不会出现问题的,错误主要出现在对字符串(这里值得是字母组成的字符串,不对汉字进行讨论)的操作, 看一下个例子:
```js
> var result = "Brick" < "alphabet"; // true;
> var result = "Brick".toLowerCase() < "alphabet".toLowerCase(); // false
```
> 原因:在比较字符串时,实际比较的是两个字符串中对应位置的每个字符的字符编码。已知大写字母的字符编码(A-Z -> 65-90)全部小于小写的字符编码(a-z -> 97-122) 。数字对应(0-9 -> 48-> 57)。
  评论这张
 
阅读(118)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017