0
点赞
收藏
分享

微信扫一扫

JS 数组的排序 sort()方法原理详解

Array.prototype.sort()

sort() 方法用原地算法对数组的元素进行排序,并返回数组。

const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// expected output: Array ["Dec", "Feb", "Jan", "March"]

const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// expected output: Array [1, 100000, 21, 30, 4]

arr.sort([compareFunction])

该方法传入一个用来进行排序的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位

compareFunction 参数:

  • fierstEl

    第一个用来比较的元素

  • secondEl

    第二个用来比较的元素

返回值:排序后的数组

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

  • 如果 compareFunction(a, b) return 的结果小于 0 ,那么 a 会被排列到 b 之前;

  • 如果 compareFunction(a, b) return 的结果等于 0 , a 和 b 的相对位置不变。

  • 如果 compareFunction(a, b) return 的结果大于 0 , b 会被排列到 a 之前。

如下,比较函数格式示例:

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) {
  var nameA = a.name.toUpperCase(); // 全部转为大写进行比较
  var nameB = b.name.toUpperCase(); 
  if (nameA < nameB) { //如果 nameA 小于 B 则位置不比变
    return -1;
  }
  if (nameA > nameB) {  //  如果name A 大于 B 则B 与 A 交换位置
    return 1;
  }

  // 名字相同时 不变
  return 0;
});

// 按对象的值进行降序
items.sort(function (a, b) {
  return (a.value - b.value)
});

比较数字非字符串,比较函数可以简单的以 a 减 b,如下的函数将会将数组升序排列(降序则为 b 减 a)

var numbers = [4, 2, 5, 1, 3];
// 若 a 小于 b,即 a - b 小于零,则返回一个小于零的值,数组将按照升序排列。
// 一开始 4-2 =2 大于0 随后 b 往前 a往后,4 - 5 = -1 小于零,则 a 往前,b 往后一直按升序排序
numbers.sort((a, b) => a - b);
console.log(numbers);
// [1, 2, 3, 4, 5]

// 遇到小的数(b) 减去 大的数(a) 不会变位置 b-a 小于0 (a,b)位置不变
// 遇到大的数(b) 减去 小的数(a) b-a 大于0 ,(a,b) 大的往前放,小往后,最后成降序排序
numbers.sort((a, b) => b - a);
console.log(numbers);
举报

相关推荐

0 条评论