一、常规
<!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' }]