Array.prototype.sort()
sort()
方法用类似Map原地算法对数组的元素进行排序,并返回数组,会改变原数组为排序好的数组。
arr.sort([compareFunction])
该方法传入一个用来进行排序的函数。
如果省略,元素按照转换为的字符串的各个字符的Unicode位来进行排序
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]
但是可以看到,这样子进行的排序,在排序数字类型的时候会出现不稳定性,所以为了稳定的排序数组,我们将传入一个比较函数来达到稳定性排序。
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 之前。
compareFunction(a, b)
必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
如下,比较函数格式示例:
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) {
if(a < b){ // a < b 则 把小的 a 放前
return -1
}
});
要比较数字而非字符串,比较函数可以简单的以 a 减 b,如下的函数会将数组升序排列(降序则为 b 减 a)
var numbers = [4, 2, 5, 1, 3];
/*
一开始 4-2 =2 return大于0的数 b(较小的数)会往前 a(较大的数)会往后,
然后第二次 4 - 5 = -1 return小于0的数,则 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);
// [5, 4, 3, 2, 1]
var exchange = function(nums) {
/*
奇数在后,偶数在前,使 b % 2(奇数) - a % 2(偶数)大于0 b(奇数)往前 a(偶数) 往后
奇数在前,偶数在后,使 b % 2 (偶数)- a % 2(奇数)小于0 a,b位置不变依然保持 前奇数,后偶数
最后依次将 奇数排在前,偶数排在后
*/
return nums.sort((a, b) => b % 2 - a % 2);
};
var minNumber = function(nums) {
if(nums.length == 0) return null
// 3 30 直接比的话输出是 330 要字符串相加后再比大小变成 303这样才是最小的
return nums.sort((a,b)=>((a+'') + (b+'') -0) - ( (b+'') + (a+'') -0 )).join('')
};