Array.prototype.sort()

Array.prototype.sort()

返回值:排序后的数组

  • 无参情况
let one = ['FBI', 'abc', 'cba', 'NBA']
console.log(one.sort());
// ['FBI', 'NBA', 'abc', 'cba']
// 无参:按照 Unicode 编码进行排序,str.charCodeAt() 可查看字符串指定位置的 Unicode 编码

let two = [1, 10000, 3, 4, 9, 80]
console.log(two.sort());
// [1, 10000, 3, 4, 80, 9]
// 因为没有指定参数,所以按照 Unicode码 排序

有参情况,首先得明白一点:大于0则调换位置,否则不换。并且有参情况你必须得给它返回一个Number类型的值,你不能粗心用字符串相加减

  • 对数字排序
let numbers = [4, 3, 5, 1, 3]
numbers.sort((a, b) => a - b)
console.log(numbers);  //[ 1, 3, 3, 4, 5 ]
// 所以他们说a-b一定是升序是有道理的
// 因为若 a-b>0
// 则 a > b
// 又因为 a-b>0
// 所以得调换位置
// 把 b 调换到前面,自然小的就在前面

numbers.sort((a, b) => b - a)
console.log(numbers);  //[ 5, 4, 3, 3, 1 ]
// 若 b - a > 0
// 则 b > a
// 又因为 b - a > 0
// 则 b 调到 a 的前面
// 即大的在前,小的在后,降序
  • 根据对象属性排序
let items = [
    { name: 'Edward', value: 21 },
    { name: 'Sharpe', value: 37 },
    { name: 'And', value: 45 },
    { name: 'The', value: -12 },
    { name: 'Zeros', value: 37 }
];
items.sort(function (a, b) {
    return a.value - b.value
})
console.log(items);
//[
//  { name: 'The', value: -12 },  
//  { name: 'Edward', value: 21 },
//  { name: 'Sharpe', value: 37 },
//  { name: 'Zeros', value: 37 }, 
//  { name: 'And', value: 45 }    
//]
  • 根据对象属性排序2
let items = [
    { name: 'Edward', value: 21 },
    { name: 'Sharpe', value: 37 },
    { name: 'Magnetic' },
    { name: 'And', value: 45 },
    { name: 'The', value: -12 },
    { name: 'Zeros', value: 37 }
];
items.sort(function (a, b) {
    return a.value - b.value
})
console.log(items);
//[
//  { name: 'Edward', value: 21 },
//  { name: 'Sharpe', value: 37 },
//  { name: 'Magnetic' },
//  { name: 'The', value: -12 },  
//  { name: 'Zeros', value: 37 }, 
//  { name: 'And', value: 45 }    
//] 
//没有指定属性的会保持在原来位置不动,因为迭代器会跳过它,并且它就像一堵墙一样,把前后都隔开了,你发现没有,-12在那堵墙后面排第一个
  • 根据对象属性排序3
let 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((a, b) => (a.name > b.name ? 1 : -1))  //规则就是规则,你必须给它返回一个Number类型的数据
//因为数字排序相减能得出一个大于0或小于0的数,但是字符串相减的话,不能得出一个大于或小于0的数,必须手动指定
console.log(items);
// [
//     { name: 'And', value: 45 },
//     { name: 'Edward', value: 21 },
//     { name: 'Magnetic' },
//     { name: 'Sharpe', value: 37 },
//     { name: 'The', value: -12 },
//     { name: 'Zeros', value: 37 }
// ]
  • 根据对象属性进行排序4,封装一下
let arr = [
    { name: 'Edward', value: 21 },
    { name: 'Sharpe', value: 37 },
    { name: 'And', value: 45 },
    { name: 'The', value: -12 },
    { name: 'Magnetic' },
    { name: 'Zeros', value: 37 }
]

function byField(fieldName) {
    function asd(a, b) {
        return a[fieldName] > b[fieldName] ? 1 : -1
    }
    return asd
}
arr.sort(byField('name'))
console.log(arr);
posted @ 2022-06-03 22:03  朱在春  阅读(42)  评论(0编辑  收藏  举报