基础版(排序数字,从小到大)
let arr = [0, 3, 1, 2];
arr.sort((a, b) => a - b); //0,1,2,3
最简略版,直接比较数组中元素的值(必须是数值,因为sort方法根据传入函数返回的值与0值的比较做排序)
进阶版(根据百家姓排序,复姓暂不考虑)
//百家姓的储存数组
let nameArr = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王'];
let arr = ['王铁柱', '孙二两', '李贵', '吴安国', '钱旺财', '郑兴邦', '周满仓', '赵栓柱'];
arr.sort((a, b)=>{
//将名字中的第一个字提取出来,第一个字就是姓(演示效果不考虑复姓),然后通过姓在nameArr的索引排序
return nameArr.indexOf(a.split('')[0]) - nameArr.indexOf(b.split('')[0])
})//'赵栓柱', '钱旺财', '孙二两', '李贵', '周满仓', '吴安国', '郑兴邦', '王铁柱'
当前方法只要有一个可以用作数组作为表作为参考,就可以通过indexOf方法查询到的下标数字进行排序
进阶版(成绩排序,先排总分,总分相同再根据语文成绩排序)
let arr = [
{
name: '王铁柱',
totalScore: 610,
chinese: 120,
},
{
name: '孙二两',
totalScore: 600,
chinese: 103,
},
{
name: '李贵',
totalScore: 513,
chinese: 107,
},
{
name: '吴安国',
totalScore: 607,
chinese: 115,
},
{
name: '钱旺财',
totalScore: 600,
chinese: 107,
},
{
name: '郑兴邦',
totalScore: 513,
chinese: 124,
},
{
name: '周满仓',
totalScore: 499,
chinese: 144,
},
{
name: '赵栓柱',
totalScore: 530,
chinese: 124,
},
]
arr.sort((a, b) => {
//返回总分从大到小的排序
return b.totalScore - a.totalScore
})
arr.sort((a, b) => {
//返回总分相同时,语文成绩从大到小的排序
return b.totalScore === a.totalScore && b.chinese - a.chinese
})
打印结果:
先根据一个条件进行排序,然后在第一个条件相等时再对第二个条件进行排序即可,如有多个条件需要进行排序,使用方式一致
PS:sort方法如果不传函数,直接排序的实际业务用处不大,因为根据按照转换为的字符串的各个字符的 Unicode 位点进行排序。sort方法会改变原数组,请根据场景判断是否需要深拷贝创建副本再使用