一、常规

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <div id="box">
  11. <!-- 点击添加事件 -->
  12. <button @click="sortTicket(1)">升序排列</button>
  13. <button @click="sortTicket(2)">降序排列</button>
  14. <!-- 遍历books -->
  15. <p v-for="book in books">书名:{{book.name}}月票:{{book.ticket}}</p>
  16. </div>
  17. <!-- 引入vue -->
  18. <script src="./vue.js"></script>
  19. <script>
  20. new Vue({
  21. el: "#box",
  22. data: {
  23. books: [{
  24. id: 1,
  25. name: "明克街13号",
  26. ticket: 152
  27. }, {
  28. id: 2,
  29. name: "人族镇守使",
  30. ticket: 100
  31. }, {
  32. id: 3,
  33. name: "星门",
  34. ticket: 210
  35. }, {
  36. id: 4,
  37. name: "重生之似水流年",
  38. ticket: 175
  39. }, {
  40. id: 5,
  41. name: "我的云养女友",
  42. ticket: 972
  43. }]
  44. },
  45. methods: { /* 添加函数 */
  46. sortTicket(type) {
  47. if (type == 1) {
  48. /* 利用sort排序 升序 */
  49. this.books.sort((a, b) => {
  50. return a.ticket - b.ticket
  51. })
  52. } else if (type == 2) {
  53. /* 利用sort排序 降序*/
  54. this.books.sort((a, b) => {
  55. return b.ticket - a.ticket
  56. })
  57. }
  58. }
  59. }
  60. })
  61. </script>
  62. </body>
  63. </html>

二、按照对象中的某个属性排序

  1. var obj={name:'test'}
  2. let propertyName='name'
  3. console.log(obj.propertyName);//undefined
  4. //可以通过点语法来存取,比如obj.name指的是访问obj对象上的name属性,但是此时对象上要有这个name属性,否则访问到的就是undefined。
  5. console.log(obj[propertyName]);//test
  6. /*
  7. 1.使用中括号来存取属性,要在括号内使用属性名的字符串形式,也就是可以通过变量访问属性。
  8. 2.如果属性名中包含可以会导致语法错误的字符或者包含关键字、保留字时使用中括号语法。比如 first name中间有空格,不能使用点语法。
  9. */
  1. //sort()会在每一项上调用String()转型函数,然后比较字符串来决定顺序,即使数组的元素都是数值,也会先把数组转换为字符串再比较排序。
  2. let nums=[0,1,5,10,15]
  3. console.log(nums.sort());
  4. //0,1,10,15,5

sort() 方法可以接收一个比较函数,用于判断哪个值应该排在前面。
比较函数规则:

  1. 如果第一个参数应该排在第二个参数前面,就返回负值;
  2. 如果两个参数相等,就返回0;
  3. 如果第一个参数应该排在二个参数后面,就返回正值。 ```javascript function compare(value1,value2){ if(value1value2){ 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));

  1. 如果数组的元素是数值,或者是其valueOf方法返回数值的对象如Date对象,可以直接用第二个值减去第一个值。比较函数就是要返回小于00和大于0的数值
  2. ```javascript
  3. //常规
  4. function sortBy(property){
  5. return function(value1,value2){
  6. let a=value1[property]
  7. let b=value2[property]
  8. return b-a
  9. }
  10. }
  11. //是否升序
  12. function sortBy1(property,asc){
  13. return function (value1, value2) {
  14. let a = value1[property]
  15. let b = value2[property]
  16. // 默认升序
  17. if(asc==undefined){
  18. return a-b
  19. }else{
  20. return asc? a-b:b-a
  21. }
  22. }
  23. }
  24. console.log(value.sort(sortBy1('age',true)));

三、将一个对象数组根据另一个数组的顺序进行排序

  1. const origin = [
  2. { id: 4, name: 'name4' },
  3. { id: 3, name: 'name3' },
  4. { id: 9, name: 'name9' },
  5. { id: 1, name: 'name1' }
  6. ]
  7. const sortKey = [
  8. { sortId: 3, age: '333' },
  9. { sortId: 1, age: '111'},
  10. { sortId: 9, age: '999' },
  11. { sortId: 4, age: '444' }
  12. ]
  13. //将sortKey的sortId,与对象数组origin的id关联,并根据sortId对origin进行排序,期望结果:
  14. const origin = [
  15. { id: 3, name: 'name3' },
  16. { id: 1, name: 'name1' },
  17. { id: 9, name: 'name9' },
  18. { id: 4, name: 'name4' }
  19. ]
  20. //方案
  21. const result = origin.sort(function(a, b){
  22. return sortKey.map(s => s.sortId).indexOf(a.id) <
  23. sortKey.map(s => s.sortId).indexOf(b.id) ? -1 : 1;
  24. });
  25. // result: [{ id: 3, name: 'name3' }, { id: 1, name: 'name1' }, { id: 9, name: 'name9' }, { id: 4, name: 'name4' }]