一、常规
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><div id="box"><!-- 点击添加事件 --><button @click="sortTicket(1)">升序排列</button><button @click="sortTicket(2)">降序排列</button><!-- 遍历books --><p v-for="book in books">书名:{{book.name}}月票:{{book.ticket}}</p></div><!-- 引入vue --><script src="./vue.js"></script><script>new Vue({el: "#box",data: {books: [{id: 1,name: "明克街13号",ticket: 152}, {id: 2,name: "人族镇守使",ticket: 100}, {id: 3,name: "星门",ticket: 210}, {id: 4,name: "重生之似水流年",ticket: 175}, {id: 5,name: "我的云养女友",ticket: 972}]},methods: { /* 添加函数 */sortTicket(type) {if (type == 1) {/* 利用sort排序 升序 */this.books.sort((a, b) => {return a.ticket - b.ticket})} else if (type == 2) {/* 利用sort排序 降序*/this.books.sort((a, b) => {return b.ticket - a.ticket})}}}})</script></body></html>
二、按照对象中的某个属性排序
var obj={name:'test'}let propertyName='name'console.log(obj.propertyName);//undefined//可以通过点语法来存取,比如obj.name指的是访问obj对象上的name属性,但是此时对象上要有这个name属性,否则访问到的就是undefined。console.log(obj[propertyName]);//test/*1.使用中括号来存取属性,要在括号内使用属性名的字符串形式,也就是可以通过变量访问属性。2.如果属性名中包含可以会导致语法错误的字符或者包含关键字、保留字时使用中括号语法。比如 first name中间有空格,不能使用点语法。*/
//sort()会在每一项上调用String()转型函数,然后比较字符串来决定顺序,即使数组的元素都是数值,也会先把数组转换为字符串再比较排序。let nums=[0,1,5,10,15]console.log(nums.sort());//0,1,10,15,5
sort() 方法可以接收一个比较函数,用于判断哪个值应该排在前面。
比较函数规则:
- 如果第一个参数应该排在第二个参数前面,就返回负值;
- 如果两个参数相等,就返回0;
- 如果第一个参数应该排在二个参数后面,就返回正值。
```javascript
function compare(value1,value2){
if(value1
value2){ return -1 }else{ return 0 } } let values=[0,23,1,4,2]
// sort方法传入比较函数,数组中的数值在排序后保持了正确的顺序 console.log(values.sort(compare));// [23, 4, 2, 1, 0] //使用箭头函数的形式简写 console.log(values.sort((a,b)=>ab?-1:0));// [23, 4, 2, 1, 0] //都是数值的时候可以更简洁点 console.log(values.sort((a,b)=>b-a));
如果数组的元素是数值,或者是其valueOf方法返回数值的对象如Date对象,可以直接用第二个值减去第一个值。比较函数就是要返回小于0、0和大于0的数值```javascript//常规function sortBy(property){return function(value1,value2){let a=value1[property]let b=value2[property]return b-a}}//是否升序function sortBy1(property,asc){return function (value1, value2) {let a = value1[property]let b = value2[property]// 默认升序if(asc==undefined){return a-b}else{return asc? a-b:b-a}}}console.log(value.sort(sortBy1('age',true)));
三、将一个对象数组根据另一个数组的顺序进行排序
const origin = [{ id: 4, name: 'name4' },{ id: 3, name: 'name3' },{ id: 9, name: 'name9' },{ id: 1, name: 'name1' }]const sortKey = [{ sortId: 3, age: '333' },{ sortId: 1, age: '111'},{ sortId: 9, age: '999' },{ sortId: 4, age: '444' }]//将sortKey的sortId,与对象数组origin的id关联,并根据sortId对origin进行排序,期望结果:const origin = [{ id: 3, name: 'name3' },{ id: 1, name: 'name1' },{ id: 9, name: 'name9' },{ id: 4, name: 'name4' }]//方案const result = origin.sort(function(a, b){return sortKey.map(s => s.sortId).indexOf(a.id) <sortKey.map(s => s.sortId).indexOf(b.id) ? -1 : 1;});// result: [{ id: 3, name: 'name3' }, { id: 1, name: 'name1' }, { id: 9, name: 'name9' }, { id: 4, name: 'name4' }]
