zoukankan      html  css  js  c++  java
  • JS数组Sort方法的使用

    想用sort方法对数组排下序,代码如下:

    1 var nums = "12 645 6 85 81 0 9 365 4 752".split(" ").map(function(a){
    2  return Number(a);
    3 });
    4 console.log(nums); // 排序前 [12, 645, 6, 85, 81, 0, 9, 365, 4, 752]
    5 console.log(nums.sort()); // 排序后 [0, 12, 365, 4, 6, 645, 752, 81, 85, 9]

    排序后的结果并不是预期的按照数值大小排列的,带着疑问去查了一下《JavaScript权威指南》,发现:

    当不带参数调用sort()时,数组元素以字母表顺序排序(如有必要将临时转化为字符串进行比较)

    原来默认都是以字符串形式比较的,接着又试验了两把:

     1 var words = "Lorem ipsum dolor sit amet consectetur adipisicing elit.".split(" ");
     2 console.log(words); //["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipisicing", "elit."]
     3 //只有字符串的情况
     4 console.log(words.sort()); //["Lorem", "adipisicing", "amet", "consectetur", "dolor", "elit.", "ipsum", "sit"]
     5 //数字和字符串的情况
     6 var numAndWords = ["Lorem", "ipsum", "dolor", "sit", "amet", 12, 645, 6, 85, 81, 0];
     7 console.log(numAndWords.sort()); //[0, 12, 6, 645, 81, 85, "Lorem", "amet", "dolor", "ipsum", "sit"]
     8 //数字和部分以数字开头的字符串
     9 numAndWords = ["Lorem", "2ipsum", "13dolor", "sit", "amet", 12, 645, 6, 85, 81, 0];
    10 console.log(numAndWords.sort()); //[0, 12, "13dolor", "2ipsum", 6, 645, 81, 85, "Lorem", "amet", "sit"]

    结果都符合预期,是按照ACSII码顺序进行比较的。如果想按照数值大小进行排序,该如何操作呢?这就用到了带参数的sort方法,参数可以是function,这样就能够按照自定义的方式排序了。

    下面定义一个按照数值大小排序的方法:

     1 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
     2 console.log(nums.sort(function(a, b){
     3   if(a < b){
     4     return -1;
     5   }
     6   else if (a > b) {
     7     return 1;
     8   }
     9   else{
    10     return 0;
    11   }
    12 })); //结果为:[0, 4, 6, 9, 12, 81, 85, 365, 645, 752]

    根据《JavaScript权威指南》的说法:

    给sort方法传递一个比较函数,该函数决定了它的两个参数在排好序的数组中的先后顺序:假设第一个参数应该在前,比较函数应该返回一个小于0的数值,反之,假设第一个参数应该在后,函数应该返回一个大于0的数值,并且,假设两个值相等,函数应该返回0。

    但是如下比较函数返回大于0的数值时的测试有些意外:

     1 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
     2 console.log(nums.sort(function (a, b) {
     3   if (a < b) {
     4     return 1;
     5   }
     6 })); //结果为:[12, 645, 6, 85, 81, 0, 9, 365, 4, 752]
     7 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
     8 console.log(nums.sort(function (a, b) {
     9   if (a > b) {
    10     return 1;
    11   }
    12 })); //结果为:[12, 645, 6, 85, 81, 0, 9, 365, 4, 752]

    接着继续测试比较函数返回小于0的数值时的情况:

     1 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
     2 console.log(nums.sort(function (a, b) {
     3   if (a < b) {
     4     return -1;
     5   }
     6 })); //结果为:[0, 4, 6, 9, 12, 81, 85, 365, 645, 752]
     7 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
     8 console.log(nums.sort(function (a, b) {
     9   if (a > b) {
    10     return -1;
    11   }
    12 })); //结果为:[752, 645, 365, 85, 81, 12, 9, 6, 4, 0]

    只有比较函数返回值小于0时才会进行数组的排序。

    《JavaScript权威指南》给出了一种简便的按照数值大小比较的方法:

    1 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
    2 console.log(nums.sort(function(a, b){
    3   return a - b;
    4 })); //结果为:[0, 4, 6, 9, 12, 81, 85, 365, 645, 752]

    以上是个人测试的结果,如有不对还请指教。

  • 相关阅读:
    http和https
    openstack
    openstack安全问题
    openstack优势
    java多线程实现方式
    python多进程实现的几种方式
    Java 在提取url 生成图片以及正则表达式
    idea 生成 可执行文件
    dw cs6 支持高分辨率
    svchost.exe 大量占用的问题
  • 原文地址:https://www.cnblogs.com/jyughynj/p/ArraySort.html
Copyright © 2011-2022 走看看