js 数组排序

代码改变世界javascript

那时候的我github:https://github.com/lwzhang

js中的数组对象排序

2014-04-27 19:15 by 那时候的我, 66416 阅读, 2 评论, 收藏编辑html

1、普通数组排序  

  js中用方法sort()为数组排序。sort()方法有一个可选参数,是用来肯定元素顺序的函数。若是这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序。如:前端

var arr = ["a", "b", "A", "B"];
arr.sort();
console.log(arr);//["A", "B", "a", "b"]

由于字母A、B的ASCII值分别为6五、66,而a、b的值分别为9七、98,因此上面输出的结果是 ["A", "B", "a", "b"] 。java

  若是数组元素是数字呢,结果会是怎样?css3

var arr = [15, 8, 25, 3];
arr.sort();
console.log(arr);//[15, 25, 3, 8]

结果是 [15, 25, 3, 8] 。其实,sort方法会调用每一个数组项的toString()方法,获得字符串,而后再对获得的字符串进行排序。虽然数值15比3大,但在进行字符串比较时"15"则排在"3"前面。显然,这种结果不是咱们想要的,这时,sort()方法的参数就起到了做用,咱们把这个参数叫作比较函数。git

  比较函数接收两个参数,若是第一个参数应该位于第二个以前则返回一个负数,若是两个参数相等则返回0,若是第一个参数应该位于第二个以后则返回一个正数。例子:程序员

复制代码

var arr = [23, 9, 4, 78, 3];
var compare = function (x, y) {//比较函数
    if (x < y) {
        return -1;
    } else if (x > y) {
        return 1;
    } else {
        return 0;
    }
}
console.log(arr.sort(compare));        

复制代码

结果为 [3, 4, 9, 23, 78] ,返回了咱们想要的结果。若是要按降序排序,比较函数写成这样便可:github

复制代码

var compare = function (x, y) {
    if (x < y) {
        return 1;
    } else if (x > y) {
        return -1;
    } else {
        return 0;
    }
}

复制代码

  咱们并不能用比较函数比较一个不能转化为数字的字符串与数字的顺序:canvas

var arr = ["b", 5];
console.log(arr.sort(compare))

结果是 ["b", 5] 。由于比较函数在比较时,会把先把字符串转化为数字,而后再比较,字符串b不能转化为数字,因此就不能比较大小。然而,当不用比较函数时,会比较ASCII值,因此结果是 [5, "b"] 。

2、数组对象排序

  若是数组项是对象,咱们须要根据数组项的某个属性对数组进行排序,要怎么办呢?其实和前面的比较函数也差很少:

复制代码

var arr = [{name: "zlw", age: 24}, {name: "wlz", age: 25}];
var compare = function (obj1, obj2) {
    var val1 = obj1.name;
    var val2 = obj2.name;
    if (val1 < val2) {
        return -1;
    } else if (val1 > val2) {
        return 1;
    } else {
        return 0;
    }            
} 
console.log(arr.sort(compare));

复制代码

  输出结果为 [Object { name="wlz", age=25}, Object { name="zlw", age=24}] ,能够看到数组已经按照 name 属性进行了排序。咱们能够对上面的比较函数再改造一下:

复制代码

var compare = function (prop) {
    return function (obj1, obj2) {
        var val1 = obj1[prop];
        var val2 = obj2[prop];if (val1 < val2) {
            return -1;
        } else if (val1 > val2) {
            return 1;
        } else {
            return 0;
        }            
    } 
}

复制代码

若是想按照 age 进行排序, arr.sort(compare("age")) 便可。

  可是对age属性进行排序时须要注意了,若是age属性的值是数字,那么排序结果会是咱们想要的。但不少时候咱们从服务器传回来的数据中,属性值一般是字符串。如今我把上面的数组改成:

var arr = [{name: "zlw", age: "24"}, {name: "wlz", age: "5"}];

能够看到,我把 age 属性由数字改成了字符串,第二个数组项的 age 值改成了 "5" 。再次调用 arr.sort(compare("age")) 后,结果为:

[Object { name="zlw", age="24"}, Object { name="wlz", age="5"}]

咱们的指望是5排在25前面,可是结果不是。这是由于当两个数字字符串比较大小时,会比较它们的ASCII值大小,比较规则是:从第一个字符开始,顺次向后直到出现不一样的字符为止,而后以第一个不一样的字符的ASCII值肯定大小。因此"24"与"5"比较大小时,先比较”2“与"5"的ASCII值,显然”2“的ASCII值比"5"小,即肯定排序顺序。

  如今,咱们须要对比较函数再作一些修改:

复制代码

var compare = function (prop) {
    return function (obj1, obj2) {
        var val1 = obj1[prop];
        var val2 = obj2[prop];
        if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
            val1 = Number(val1);
            val2 = Number(val2);
        }
        if (val1 < val2) {
            return -1;
        } else if (val1 > val2) {
            return 1;
        } else {
            return 0;
        }            
    } 
}

复制代码

在比较函数中,先把比较属性值转化为数字 Number(val1) 再经过 !isNaN(Number(val1)) 判断转化后的值是否是数字(有多是NaN),转化后的值若是是数字,则比较转换后的值,这样就能够获得咱们想要的结果了, 调用  arr.sort(compare("age")) 获得:

[Object { name="wlz", age="5"}, Object { name="zlw", age="24"}]

能够看到,确实是按正确的方式排序了。

   这篇文章所讲的都是基础的,没什么技术含量,只是最近项目中遇到了对数组对象进行排序的问题,因此在这里写出来分享一下,相信总能帮到一些朋友。

  

好文要顶 关注我 收藏该文  

那时候的我
关注 - 17
粉丝 - 84

+加关注

16

0

« 上一篇:CSS3图片轮播效果
» 下一篇:js中call、apply、bind的用法

ADD YOUR COMMENT

 

  1. #1楼 接二连珊  2017-10-25 17:44

    不错,学习了

    支持(1)反对(0)

  2. #2楼 德鲁叔叔  2018-07-01 20:52

    引用在比较函数中,先把比较属性值转化为数字 Number(val1) 再经过 !isNaN(Number(val1)) 判断转化后的值是否是数字(有多是NaN)


    不太理解这句话?直接经过!isNaN(val1)来判断是否为数值不能够吗?

    支持(0)反对(0)

刷新评论刷新页面返回顶部

注册用户登陆后才能发表评论,请 登陆 或 注册访问网站首页。

【推荐】超50万VC++源码: 大型组态工控、电力仿真CAD与GIS源码库!
【前端】SpreadJS表格控件,可嵌入应用开发的在线Excel
【免费】程序员21天搞定英文文档阅读
【推荐】如何快速搭建人工智能应用?

qcloud0814

最新IT新闻:
· 偷听的智能音箱都忍不下去了:别BB,我给大家报警吧
· 第一次月球背面软着陆:嫦娥四号着陆器、月球车外观公布
· 科大讯飞、森马服饰否定投资红芯浏览器
· ETH断崖暴跌,融资缩水,创业者割肉度日
· 西湖大学重金求才!全球一流待遇挖角哈佛耶鲁,阿里高P辞职读AI
» 更多新闻...

最新知识库文章:

· 被踢出去的用户
· 成为一个有目标的学习者
· 历史转折中的“杭派工程师”
· 如何提升代码质量?
· 在腾讯的八年,个人职业思考

» 更多知识库文章...

About

我的独立博客:
http://zlwis.me


Github:https://github.com/lwzhang

昵称:那时候的我
园龄:4年4个月
粉丝:84
关注:17

+加关注

 

最新评论

随笔档案

日历

< 2018年8月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

个人标签

随笔分类

推荐排行榜

阅读排行榜