vue 根据数组中某一项的值进行排序的方法


Posted in Javascript onAugust 30, 2018

vue中数组和对象的排序

1数组排序

<div id="app">
  <ul>
   <li v-for="a in arr1">{{a}}</li>
  </ul>
 </div>
  <script type="text/javascript">
   new Vue({
    el:"#app",
    data:{
     arr:[1,4,5,2,3,44]
    },computed:{
     arr1:function(){
      return this.arr.sort(sortNum)//调用排序方法
     }
    }
   })
   function sortNum(a,b){//排序方法
    return a-b;
   }
  </script>

2对象排序

<div id="app">
   <ul>
    <li v-for="(stu,index) in students1">{{stu}}</li>
   </ul>
  </div>
  <script type="text/javascript">
   new Vue({
    el:"#app",
    data:{
     students:[
      {name:"小a",age:20},
      {name:"小b",age:21},
      {name:"小c",age:18},
      {name:"小d",age:19},
      {name:"小f",age:18}
     ]
    },
    computed:{
     students1:function(){
      return sortKey(this.students,'age')
     }
    }
   })
   function sortKey(array,key){
    return array.sort(function(a,b){
     var x = a[key];
     var y = b[key];
     return ((x<y)?-1:(x>y)?1:0)
    })
   }
  </script>

一、前言

我在vue项目中遇到了一个表格排序的需求,根据某一项的值的大小从大到小调整数组顺序。

二、代码

vue 根据数组中某一项的值进行排序的方法

表格大概是这个样子,样式和图片在代码中简化了。

<table class="recommend_table" cellspacing="0">
 <tr>
  <th>股票</th>
  <th @click="sort('in_price')">入选价</th>
  <th @click="sort('now_price')">最新价</th>
  <th @click="sort('increase')">模拟涨跌幅</th>
 </tr>
 <tr v-for="(item,index) in recommendlist" :key="index">
  <td>
   <div class="recommend_name">{{item.name}}</div>
   <div class="recommend_num">{{item.bn}}</div>
  </td>
  <td>{{item.in_price}}</td>
  <td>{{item.now_price}}</td>
  <td>{{item.increase}}%</td>
 </tr>
</table>

<script type="text/ecmascript-6">
 export default {
  data(){
   return{
    recommendlist: [
     { name:'高科石化', bn:'002778', in_price: 20.68, now_price: 28.68, increase: 10.01 },
     { name:'中孚信息', bn:'300659', in_price: 19.46, now_price: 17.46, increase: 9.06 },
     { name:'永福股份', bn:'300712', in_price: 17.68, now_price: 32.68, increase: 2.01 }
    ],
    sortType: 'in_price'
   }
  },
  methods: {
   sort(type) {
    this.sortType = type;
    this.recommendlist.sort(this.compare(type));
    // switch(type){
     // case 'in_price':
     //  this.sortType = 'in_price';
     //  this.recommendlist.sort(this.compare('in_price'));
     //  break;
     // case 'now_price':
     //  this.sortType = 'now_price';
     //  this.recommendlist.sort(this.compare('now_price'));
     //  break;
     // case 'increase':
     //  this.sortType = 'increase';
     //  this.recommendlist.sort(this.compare('increase'));
     //  break;
    // }
   },
   compare(attr) {
    return function(a,b){
     var val1 = a[attr];
     var val2 = b[attr];
     return val2 - val1;
    }
   }
  }
 }
</script>

1. 排序方法

这里用到的是数组的sort方法,这个方法有一个需要注意的地方,就是不传参数的话,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。这并不是我们想要的排序方法,所以必须要传参。

sort方法的参数是一个函数,这个函数提供了一个比较方法,要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。

  1. 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
  2. 若 a 等于 b,则返回 0。
  3. 若 a 大于 b,则返回一个大于 0 的值。
compare(key) {
 return function(a,b){
  var val1 = a[key];
  var val2 = b[key];
  return val2 - val1;
 }
}

在代码中,compare函数中的匿名函数就是这样一个函数,但这个函数外面又嵌套了一层,这是因为需要根据数组中的某一项来排序,所以需要把这一项的key值传进来。

2. 调用排序方法

sort(type) {
 this.sortType = type;
 this.recommendlist.sort(this.compare(type));
 // switch(type){
  // case 'in_price':
  //  this.sortType = 'in_price';
  //  this.recommendlist.sort(this.compare('in_price'));
  //  break;
  // case 'now_price':
  //  this.sortType = 'now_price';
  //  this.recommendlist.sort(this.compare('now_price'));
  //  break;
  // case 'increase':
  //  this.sortType = 'increase';
  //  this.recommendlist.sort(this.compare('increase'));
  //  break;
 // }
}

一开始我按照注释的部分写的,和我一样抽象能力不是特别好的人首先会想到要这样写,但是写出来之后发现三种情况不过是重复的代码,这时我就直接用最上面两行代码来代替,写完以后感觉内心一片平和。这种复用率高的代码简直让人太舒服了。

三、结语

虽然是一个简单的功能,但是非常值得归纳总结一下。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用js自动判断浏览器分辨率的代码
Jan 28 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
Sep 28 Javascript
jquery submit ie6下失效的原因分析及解决方法
Nov 15 Javascript
jQuery滚动条插件nanoscroller使用指南
Apr 21 Javascript
JavaScript数组迭代器实例分析
Jun 09 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
May 19 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
Jul 25 Javascript
详解Angular 开发环境搭建
Jun 22 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
Jun 29 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
Dec 11 jQuery
微信小程序画布圆形进度条显示效果
Nov 17 Javascript
JS出现404错误原理及解决方案
Jul 01 Javascript
对vue中methods互相调用的方法详解
Aug 30 #Javascript
原生JS+HTML5实现的可调节写字板功能示例
Aug 30 #Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
Aug 30 #Javascript
解决jQuery使用append添加的元素事件无效的问题
Aug 30 #jQuery
jsonp跨域及实现百度首页联想功能的方法
Aug 30 #Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
Aug 30 #Javascript
解决vue的变量在settimeout内部效果失效的问题
Aug 30 #Javascript
You might like
一篇不错的PHP基础学习笔记
2007/03/18 PHP
PHP 采集获取指定网址的内容
2010/01/05 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
JavaScript 提升运行速度之循环篇 译文
2009/08/15 Javascript
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
javascript获取选中的文本的方法代码
2013/10/30 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
JQuery实现级联下拉框效果实例讲解
2015/09/17 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
Vue.js结合Ueditor富文本编辑器的实例代码
2017/07/11 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
微信小程序实现tab左右切换效果
2020/11/15 Javascript
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
使用python进行拆分大文件的方法
2018/12/10 Python
Python异常处理例题整理
2019/07/07 Python
Python实现名片管理系统
2020/02/14 Python
用python对excel进行操作(读,写,修改)
2020/12/25 Python
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
高级3D打印市场:Gambody
2019/12/26 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
护士实习生自我鉴定范文
2013/12/10 职场文书
2014年元旦感言
2014/03/06 职场文书
小学生作文评语大全
2014/04/21 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书