JS对象数组的排序(二十二)下

简介: JS对象数组的排序(二十二)

五. 对象数组的排序


要进行排序的六个对象。 以user 对象为例。


//1.定义要排序的对象。
  var user1={"code":"101","name":"两个蝴蝶飞","age":24,"sex":"男","description":"一个快乐的程序员101"};
  var user2={"code":"102","name":"精灵妹","age":24,"sex":"女","description":"一个快乐的精灵102"};
  var user3={"code":"103","name":"老蝴蝶","age":25,"sex":"男","description":"一个快乐的程序员103"};
  var user4={"code":"104","name":"蝴蝶飞","age":25,"sex":"男","description":"一个快乐的程序员104"};
  var user5={"code":"105","name":"精小妹","age":24,"sex":"女","description":"一个快乐的精灵105"};
  var user6={"code":"106","name":"蝴蝶飞3号","age":24,"sex":"男","description":"一个快乐的程序员106"};


五.一 单纯的对象 sort() 方法


function validateArrF5(){
  //1.定义要排序的对象。
  var user1={"code":"101","name":"两个蝴蝶飞","age":24,"sex":"男","description":"一个快乐的程序员101"};
  var user2={"code":"102","name":"精灵妹","age":24,"sex":"女","description":"一个快乐的精灵102"};
  var user3={"code":"103","name":"老蝴蝶","age":25,"sex":"男","description":"一个快乐的程序员103"};
  var user4={"code":"104","name":"蝴蝶飞","age":25,"sex":"男","description":"一个快乐的程序员104"};
  var user5={"code":"105","name":"精小妹","age":24,"sex":"女","description":"一个快乐的精灵105"};
  var user6={"code":"106","name":"蝴蝶飞3号","age":24,"sex":"男","description":"一个快乐的程序员106"};
  //2. 将对象放置在数组里面。
  var arr=new Array();
  //故意,将2与1调换位置。
  arr.push(user2);
  arr.push(user1);
  arr.push(user3);
  arr.push(user4);
  arr.push(user5);
  arr.push(user6);
  //3. 将数组进行排序。
  arr.sort();  //发现,并没有排序。 是按照数组放置的顺序进行的
  //3.输出新的排序后的数组。
  for(var i=0;i<arr.length;i++){
    console.log((i+1)+":"+JSON.stringify(arr[i]));
  }
}


展示效果:


20190725183833124.png


老蝴蝶发现,并没有排序。 是按照数组放置的顺序进行的。


五.二 比较方法里面写死属性


如果想按照 编号进行排序,那么需要自定义排序方法了。


var compareObject=function(obj1,obj2){
  //内定的,按照排序进行排序。 对象的编号 code 写死在这里面。
  var code1=obj1["code"];
  var code2=obj2["code"];
  //console.log("输出值:"+code1+","+code2);
  //编号,如果是字符串的话,则要先将其转换成字符串。
  //code1=code1.toString();
  //code2=code2.toString();
  if(code1<code2){
    return -1;
  }else if(code1>code2){
    return 1;
  }else{
    return 0;
  }
  // 也可以直接写,  return code1-code2;
}
function validateArrF6(){
  //1.定义要排序的对象。  可以在前面加A变成字符串。
  var user1={"code":"101","name":"两个蝴蝶飞","age":24,"sex":"男","description":"一个快乐的程序员101"};
  var user2={"code":"102","name":"精灵妹","age":24,"sex":"女","description":"一个快乐的精灵102"};
  var user3={"code":"103","name":"老蝴蝶","age":25,"sex":"男","description":"一个快乐的程序员103"};
  var user4={"code":"104","name":"蝴蝶飞","age":25,"sex":"男","description":"一个快乐的程序员104"};
  var user5={"code":"105","name":"精小妹","age":24,"sex":"女","description":"一个快乐的精灵105"};
  var user6={"code":"106","name":"蝴蝶飞3号","age":24,"sex":"男","description":"一个快乐的程序员106"};
  //2. 将对象放置在数组里面。
  var arr=new Array();
  //故意,将2与1调换位置。
  arr.push(user2);
  arr.push(user1);
  arr.push(user3);
  arr.push(user4);
  arr.push(user5);
  arr.push(user6);
  //3. 将数组进行排序。
  arr.sort(compareObject);
  //3.输出新的排序后的数组。
  for(var i=0;i<arr.length;i++){
    console.log((i+1)+":"+JSON.stringify(arr[i]));
  }
}


展示:


20190725183841488.png


其中,obj1 为前一个对象,obj2 为后一个对象。


老蝴蝶把 对象user 的编号 code 硬编码在方法里面, 那么这个方法 compareObject() 便只能按照编号进行排序。 如果想按照年龄进行排序,则需要再重新写一个方法,这样扩展性不好。


五.三 比较的属性由外部传入


如按照年龄进行相应的排序。


var compareObjectByProp=function(prop){
  return function compareObject(obj1,obj2){
    var code1=obj1[prop];
    var code2=obj2[prop];
    //根据属性值的类型,可能需要进行一下相应的判断。
    //如果数字的话,就转换成数字,进行数字之间的比较。 如果是数字的话,要两个都是数字,不然没有意义。 一个数字,另外一个是字符串,那么数字只是数字型的字符串,类型并不是数字。
    if (!isNaN(Number(code1)) && !isNaN(Number(code2))) {
      code1=Number(code1);
      code2=Number(code2);
    }
    return code1-code2;  //代替以前的 if elseif else 的判断。
  }
}
function validateArrF7(){
  //1.定义要排序的对象。  可以在前面加A变成字符串。
  var user1={"code":"101","name":"两个蝴蝶飞","age":24,"sex":"男","description":"一个快乐的程序员101"};
  var user2={"code":"102","name":"精灵妹","age":24,"sex":"女","description":"一个快乐的精灵102"};
  var user3={"code":"103","name":"老蝴蝶","age":25,"sex":"男","description":"一个快乐的程序员103"};
  var user4={"code":"104","name":"蝴蝶飞","age":25,"sex":"男","description":"一个快乐的程序员104"};
  var user5={"code":"105","name":"精小妹","age":24,"sex":"女","description":"一个快乐的精灵105"};
  var user6={"code":"106","name":"蝴蝶飞3号","age":24,"sex":"男","description":"一个快乐的程序员106"};
  //2. 将对象放置在数组里面。
  var arr=new Array();
  //故意,将2与1调换位置。
  arr.push(user2);
  arr.push(user1);
  arr.push(user3);
  arr.push(user4);
  arr.push(user5);
  arr.push(user6);
  //3. 将数组进行排序。 将属性 年龄 age传入进去。
  arr.sort(compareObjectByProp("age"));
  //3.输出新的排序后的数组。
  for(var i=0;i<arr.length;i++){
    console.log((i+1)+":"+JSON.stringify(arr[i]));
  }
}


展示效果:


20190725183850199.png


这样,就可以按照年龄进行相应的排序了。


五.四 传入属性并且传入排序的方式,是升序,还是降序。


如传入年龄,但是是降序排序。


var compareObjectByProp=function(prop,order){
  return function compareObject(obj1,obj2){
    var code1=obj1[prop];
    var code2=obj2[prop];
    //根据属性值的类型,可能需要进行一下相应的判断。
    //如果数字的话,就转换成数字,进行数字之间的比较。 如果是数字的话,要两个都是数字。 一个数字,另外一个是字符串,那么数字只是数字型的字符串,类型并不是数字。
    if (!isNaN(Number(code1)) && !isNaN(Number(code2))) {
      code1=Number(code1);
      code2=Number(code2);
    }
    if(order&&order.toLowerCase()=="desc"){ //有值,并且值为desc
      return code2-code1;
    }
    return code1-code2;  //代替以前的 if elseif else 的判断。
  }
}
function validateArrF8(){
  //1.定义要排序的对象。  可以在前面加A变成字符串。
  var user1={"code":"101","name":"两个蝴蝶飞","age":24,"sex":"男","description":"一个快乐的程序员101"};
  var user2={"code":"102","name":"精灵妹","age":24,"sex":"女","description":"一个快乐的精灵102"};
  var user3={"code":"103","name":"老蝴蝶","age":25,"sex":"男","description":"一个快乐的程序员103"};
  var user4={"code":"104","name":"蝴蝶飞","age":25,"sex":"男","description":"一个快乐的程序员104"};
  var user5={"code":"105","name":"精小妹","age":24,"sex":"女","description":"一个快乐的精灵105"};
  var user6={"code":"106","name":"蝴蝶飞3号","age":24,"sex":"男","description":"一个快乐的程序员106"};
  //2. 将对象放置在数组里面。
  var arr=new Array();
  //故意,将2与1调换位置。
  arr.push(user2);
  arr.push(user1);
  arr.push(user3);
  arr.push(user4);
  arr.push(user5);
  arr.push(user6);
  //3. 将数组进行排序。
  arr.sort(compareObjectByProp("age","desc"));
  //3.输出新的排序后的数组。
  for(var i=0;i<arr.length;i++){
    console.log((i+1)+":"+JSON.stringify(arr[i]));
  }
}



展示效果:


20190725184013763.png


如果传入的order 没有值,那么就默认是 asc, 升序。 如果传入的是asc,那么就是升序。 只有当传入desc 时才是降序。 当然,老蝴蝶这只是一个简单的排序。


五.五 多属性排序


想先按照年龄从小到大排序,如果年龄一致,则按照编号从大到小排序。


这个时候,可不能简单的先按照年龄从小到大排序,然后再编号从大到小排序。


arr=arr.sort(compareObjectByProp("age","asc"));
arr=arr.sort(compareObjectByProp("code","desc"));


这个时候,会以最后的一个排序为准,即以编号从大到小为准。


20190725183937132.png


这个时候,就需要重新写方法了, 写两个属性的方法。


var compareObjectByProp=function(prop1,prop2){
  return function compareObject(obj1,obj2){
    //取出第一列的值。
    var code1=obj1[prop1];
    var code2=obj2[prop1];
    //根据属性值的类型,可能需要进行一下相应的判断。
    //如果数字的话,就转换成数字,进行数字之间的比较。 如果是数字的话,要两个都是数字。 一个数字,另外一个是字符串,那么数字只是数字型的字符串,类型并不是数字。
    if (!isNaN(Number(code1)) && !isNaN(Number(code2))) {
      code1=Number(code1);
      code2=Number(code2);
    }
    //取出第二列的值。
    var code3=obj1[prop2];
    var code4=obj2[prop2];
    //根据属性值的类型,可能需要进行一下相应的判断。
    //如果数字的话,就转换成数字,进行数字之间的比较。 如果是数字的话,要两个都是数字。 一个数字,另外一个是字符串,那么数字只是数字型的字符串,类型并不是数字。
    if (!isNaN(Number(code3)) && !isNaN(Number(code4))) {
      code3=Number(code3);
      code4=Number(code4);
    }
    if(code1<code2){   //升序和降序 写在方法里面,当然,也可以通过参数传入进来。
      return -1;
    }else if(code1>code2){
      return 1;
    }else {
      //return code3-code4;
      return code4-code3;
    }
  }
}
function validateArrF9(){
  //1.定义要排序的对象。  可以在前面加A变成字符串。
  var user1={"code":"101","name":"两个蝴蝶飞","age":24,"sex":"男","description":"一个快乐的程序员101"};
  var user2={"code":"102","name":"精灵妹","age":24,"sex":"女","description":"一个快乐的精灵102"};
  var user3={"code":"103","name":"老蝴蝶","age":25,"sex":"男","description":"一个快乐的程序员103"};
  var user4={"code":"104","name":"蝴蝶飞","age":25,"sex":"男","description":"一个快乐的程序员104"};
  var user5={"code":"105","name":"精小妹","age":24,"sex":"女","description":"一个快乐的精灵105"};
  var user6={"code":"106","name":"蝴蝶飞3号","age":24,"sex":"男","description":"一个快乐的程序员106"};
  //2. 将对象放置在数组里面。
  var arr=new Array();
  //故意,将2与1调换位置。
  arr.push(user2);
  arr.push(user1);
  arr.push(user3);
  arr.push(user4);
  arr.push(user5);
  arr.push(user6);
  //3. 将数组进行排序。  可以进行单个函数的多次调用。
  arr=arr.sort(compareObjectByProp("age","code"));
  //3.输出新的排序后的数组。
  for(var i=0;i<arr.length;i++){
    console.log((i+1)+":"+JSON.stringify(arr[i]));
  }
}


展示:


20190725183927678.png


当然,升序和降序也可以当成参数传入进去, 也可以多个值,如 年龄,成绩,编号 等排序, 但这种情况不常用,一般两个属性就够了,而且是固定好排序的。


这就是对象数组排序的基本方式。


谢谢!!!

相关文章
|
8月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
前端开发 JavaScript 算法
使用 JavaScript 数组方法实现排序与去重
【10月更文挑战第21天】通过灵活运用 `sort()` 方法和 `filter()` 方法,我们可以方便地实现数组的排序和去重。同时,深入理解排序和去重的原理,以及根据实际需求进行适当的优化,能够更好地应对不同的情况。可以通过实际的项目实践来进一步掌握这些技巧,并探索更多的应用可能性。
357 59
|
自然语言处理 前端开发 JavaScript
🛠️ JavaScript数组操作指南:20个精通必备技巧🚀
本文详细介绍了 JavaScript 中的 20 个高效数组操作技巧,涵盖了从基本的添加、移除元素,到数组转换和去重等高级操作。强调了不可变性的重要性,提供了清晰的代码示例,帮助开发者编写更整洁和高效的代码。无论是新手还是经验丰富的开发者,这些技巧都将显著提升您的编码能力,使您在项目中更具竞争力。
219 2
|
JavaScript 前端开发 测试技术
JS都有哪些操作数组的方法
JS都有哪些操作数组的方法
406 3
|
JavaScript
js删除数组中已知下标的元素
js删除数组中已知下标的元素
356 4
|
缓存 JavaScript 前端开发
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
176 1
|
JavaScript 前端开发 API
JS中数组的方法flat()怎么用
JS中数组的方法flat()怎么用
203 0

热门文章

最新文章