天天看點

Vue 按照數組對象的屬性進行排序(包含時間格式排序)

Vue 數組對象排序(包含時間格式排序)

最後完成後的效果大概是這樣

Vue 按照數組對象的屬性進行排序(包含時間格式排序)
Vue 按照數組對象的屬性進行排序(包含時間格式排序)

1. 排序方法

這裡用到的是數組的sort方法,這個方法有一個需要注意的地方,就是不傳參數的話,将按字母順序對數組中的元素進行排序,說得更精确點,是按照字元編碼的順序進行排序。這并不是我們想要的排序方法,是以必須要傳參。

sort方法的參數是一個函數,這個函數提供了一個比較方法,要比較兩個值,然後傳回一個用于說明這兩個值的相對順序的數字。

  • [ 若 a 小于 b,在排序後的數組中 a 應該出現在 b 之前,則傳回一個小于 0 的值。 ]
  • [ 若 a 等于 b,則傳回 0。 ]
  • [ 若 a 大于 b,則傳回一個大于 0 的值。 ]
compare(attr){                  // 排序方法
         let that = this;
         return function(a,b){
                 let val1 = a[attr];
                 let val2 = b[attr];
                 if(that.order){
                         if(that.sortType == 'time'){            // 如果是時間就轉換成時間格式
                                 return new Date(val2.replace(/-/,'/')) - new Date(val1.replace(/-/,'/'));
                         }else{
                                 return val2 - val1;
                         }
                 }else{
                         if(that.sortType == 'time'){	    // 如果是時間就轉換成時間格式
                                 return new Date(val1.replace(/-/,'/')) - new Date(val2.replace(/-/,'/'));
                         }else{
                                 return val1 - val2;
                         }
                 }
         }
 }
           

在代碼中,compare函數中的匿名函數就是這樣一個函數,但這個函數外面又嵌套了一層,這是因為需要根據數組中的某一項來排序,是以需要把這一項的key值傳進來。

– 好了,下面放一下整體代碼:

<template>

	<div class="top">
		<div class="th  name">顧客名稱</div>
		<div class="th phone">手機号碼</div>
		<div class="th ticket" @click="sort('ticket')">卡券
			<i class="fa fa-exchange" aria-hidden="true"></i>
		</div>
		<div class="th integral" @click="sort('integral')">積分
			<i class="fa fa-exchange" aria-hidden="true"></i>
		</div>
		<div class="handle"></div>
		<div class="th time" @click="sort('time')">建立時間
			<i class="fa fa-exchange" aria-hidden="true"></i>
		</div>
	</div>

</template>
           

js

<script>
	data: function(){
        return {
                Dmessages: [{
					name: '吳嬌',
	                phone: 15265320210,
		            ticket: 3,
	                integral: 300000,
					time:'2019-1-19',
				},{
                       name: '忙着長肉',
                       phone: 15265320210,
                       ticket: 2,
                       integral: 50000,
                       time:'2019-1-29'
               },{
                       name: '劉珊珊',
                       phone: 15265320210,
                       ticket: 5,
                       integral: 3000,
                       time:'2019-1-22'
               },{
                       name: '劉珊珊',
                       phone: 15265320210,
                       ticket: 9,
                       integral: 90000,
                       time:'2019-1-30'
               }],
               sortType: null,                 // 數組對象中的哪一個屬性進行排序
               order: false,                   // 升序還是降序
        }
	},
	methods: {
        sort(type){                     // 排序
                this.order = !this.order;		// 更改為 升序或降序
                this.sortType = type;
                this.Dmessages.sort(this.compare(type));
                // 調用下面 compare 方法 并傳值
        },
        compare(attr){                  // 排序方法
                let that = this;
                return function(a,b){
                        let val1 = a[attr];
                        let val2 = b[attr];

                        if(that.order){
                                if(that.sortType == 'time'){            // 如果是時間就轉換成時間格式
                                        return new Date(val2.replace(/-/,'/')) - new Date(val1.replace(/-/,'/'));
                                }else{
                                        return val2 - val1;
                                }

                        }else{
                                if(that.sortType == 'time'){
                                        return new Date(val1.replace(/-/,'/')) - new Date(val2.replace(/-/,'/'));
                                }else{
                                        return val1 - val2;
                                }
                        }
                }
        }
},
</script>
           

雖然是一個簡單的功能,但是還是非常值得總結一下。