Apply your JS skills to key Mozilla projects as an MDN Fellow! http://mzl.la/MDNFellowship

mozilla
您的搜索结果

    Array.prototype.sort()

    概述

    sort() 方法对数组的元素做原地的排序,并返回这个数组。 sort 可能不是稳定的。默认按照字符串万国码位点排序。

    语法

    array.sort([
    compareFunction]);
    

    参数

    compareFunction
    可选的。用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的诸葛字符的万国码位点进行排序。

    描述

    如果没有指明 compareFunction ,那么元素会被转换为字符串并按照万国码位点顺序排序。例如 "Cherry" 会被排列到 "banana" 之前。当对数字进行排序的时候, 9 会出现在 80 之后,因为他们会先被转换为字符串,而 "80" 比 "9" 要靠前。

    var fruit = ['apples', 'bananas', 'Cherries'];
    fruit.sort(); // ['Cherries', 'apples', 'bananas'];
    
    var scores = [1, 2, 10, 21]; 
    scores.sort(); // [1, 10, 2, 21]
    
    var things = ['word', 'Word', '1 Word', '2 Words'];
    things.sort(); // ['1 Word', '2 Words', 'Word', 'word']
    // In Unicode, numbers come before upper case letters,
    // which come before lower case letters.

    如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。记 a 和 b 是两个将要被比较的元素:

    • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
    • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAS次日普通 标准并不保证这一行为,而且不是所有浏览器会遵守(例如 2003 年时的 Mozilla );
    • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
    • compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

    所以,比较函数格式如下:

    function compare(a, b) {
      if (a is less than b by some ordering criterion) {
        return -1;
      }
      if (a is greater than b by the ordering criterion) {
        return 1;
      }
      // a 和 b 相等
      return 0;
    }

    希望比较数字而非字符串,比较函数可以简单的以 b 减 a,如下的函数将会将数组升序排列

    function compareNumbers(a, b) {
      return a - b;
    }

    sort 方法可以使用 函数表达式 方便地书写:

    var numbers = [4, 2, 5, 1, 3];
    numbers.sort(function(a, b) {
      return a - b;
    });
    print(numbers);

    对象可以按照某个属性排序:

    var items = [
      { name: 'Edward', value: 21 },
      { name: 'Sharpe', value: 37 },
      { name: 'And', value: 45 },
      { name: 'The', value: -12 },
      { name: 'Magnetic' },
      { name: 'Zeros', value: 37 }
    ];
    items.sort(function (a, b) {
      if (a.name > b.name) {
        return 1;
      }
      if (a.name < b.name) {
        return -1;
      }
      // a 和 b 的 name 相等
      return 0;
    });

    示例

    例子:创建、显示和排序数组

    下述示例创建了四个数组,并展示原数组。之后对数组进行排序。对比了数字数组分别指定与不指定比较函数的结果。

    var stringArray = ["Blue", "Humpback", "Beluga"];
    var numericStringArray = ["80", "9", "700"];
    var numberArray = [40, 1, 5, 200];
    var mixedNumericArray = ["80", "9", "700", 40, 1, 5, 200];
    
    function compareNumbers(a, b)
    {
      return a - b;
    }
    
    // again, assumes a print function is defined
    print("stringArray: " + stringArray.join() +"\n");
    print("Sorted: " + stringArray.sort() +"\n\n");
    
    print("numberArray: " + numberArray.join() +"\n");
    print("Sorted without a compare function: " + numberArray.sort() +"\n");
    print("Sorted with compareNumbers: " + numberArray.sort(compareNumbers) +"\n\n");
    
    print("numericStringArray: " + numericStringArray.join() +"\n");
    print("Sorted without a compare function: " + numericStringArray.sort() +"\n");
    print("Sorted with compareNumbers: " + numericStringArray.sort(compareNumbers) +"\n\n");
    
    print("mixedNumericArray: " + mixedNumericArray.join() +"\n");
    print("Sorted without a compare function: " + mixedNumericArray.sort() +"\n");
    print("Sorted with compareNumbers: " + mixedNumericArray.sort(compareNumbers) +"\n\n");
    

    该示例的返回结果如下。输出显示,当使用比较函数后,数字数组会按照数字大小排序。

    stringArray: Blue,Humpback,Beluga
    Sorted: Beluga,Blue,Humpback
    
    numberArray: 40,1,5,200
    Sorted without a compare function: 1,200,40,5
    Sorted with compareNumbers: 1,5,40,200
    
    numericStringArray: 80,9,700
    Sorted without a compare function: 700,80,9
    Sorted with compareNumbers: 9,80,700
    
    mixedNumericArray: 80,9,700,40,1,5,200
    Sorted without a compare function: 1,200,40,5,700,80,9
    Sorted with compareNumbers: 1,5,9,40,80,200,700
    

    例子:排序非 ASCII 字符

    当排序非 ASCII 字符的字符串(如包含类似 e, é, è, a, ä 等字符的字符串)。一些非英语语言的字符串需要使用 String.localeCompare。这个函数可以将函数排序到正确的顺序。

    var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu'];
    items.sort(function (a, b) {
      return a.localeCompare(b);
    });
    
    // items is ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']

    例子:使用映射改善排序

    compareFunction 可能需要对元素做多次映射以实现排序,尤其当 compareFunction 较为复杂,且元素较多的时候,某些 compareFunction 可能会导致很高的负载。使用 map 辅助排序将会是一个好主意。基本思想是首先将数组中的每个元素比较的实际值取出来,排序后再将数组恢复。

    // 需要被排序的数组
    var list = ['Delta', 'alpha', 'CHARLIE', 'bravo'];
    
    // 对需要排序的数字和位置的临时存储
    var map = list.map(function(e, i) {
      return { index: i, value: e.toLowerCase() };
    })
    
    // 按照多个值排序数组
    map.sort(function(a, b) {
      return +(a.value > b.value) || +(a.value === b.value) - 1;
    });
    
    // 根据索引得到排序的结果
    var result = map.map(function(e){
      return list[e.index];
    });

    规范

    Specification Status Comment
    ECMAScript 1st Edition Standard Initial definition.
    ECMAScript 5.1 (ECMA-262)
    Array.prototype.sort
    Standard  
    ECMAScript 6 (ECMA-262)
    Array.prototype.sort
    Release Candidate  

    浏览器兼容性

    Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
    Basic support 1.0 1.0 (1.7 or earlier) 5.5 (Yes) (Yes)
    Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
    Basic support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

    参考

     

    文档标签和贡献者

    此页面的贡献者有: ziyunfei, Oatn, tiansh, teoli
    最后编辑者: tiansh,