sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序

Posted taohuaya

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序相关的知识,希望对你有一定的参考价值。

转载: 查看原文

javascript中,对象和数组是两种不同的类型,这和php中的数组概念不同。在javascript中,也有一些精妙的算法,用来对一些对象进行排序。我在面试迅雷的时候,也拿到一道题,当时做题的时候考虑到时间,没有去仔细研究,回来后再读了一些方法,就知道真正的考点在哪里了。

我们现在有一组“学生”对象,包含“名字,年龄”等属性,现在要求一个算法,把这些对象放在一个数组里,可以实现按照年龄对这些对象进行排序。

var sdts = [
  { name:"小明", age:12 },
  { name:"小红", age:13 },
  { name:"小花", age:11 }
]

 

那么考点在哪里呢?实际上在于数组对象的sort方法。

 sdts.sort(fun) 

fun是一个函数,排序根据这个函数返回值来进行判断,如果返回值小于0表示两个元素不需要交换位置,1表示要用交互位置,0表示相等,实际上<=0等效。

sort方法有两个注意点:

  1. 会操作原始数组,经过操作后原始数组发生变化
  2. 默认排序按照字符编码排序,例如,我们有下面的一个例子:
var arr1 = [14,23,11,6,87,67];
arr1.sort();// [11,14,23,6,67,87] 按字符而非数值排序

 

想要完成值比较排序,必须传入sort参数(函数)进行规则制定:

function sortRule(a, b) {
  return a - b; // 如果a>=b,返回自然数,不用交换位置
}
arr1.sort(sortRule);

 

但是,如果遇到我们上面题目中一样,每个元素并非是数组,而是对象,那应该怎么去处理呢?其实道理是一样的,只不过我们要在规制函数中重新编写一个适合对象的规制:

functon sortRule(a, b) {
  return a.age - b.age;
}

 

当然,这样写会遇到一些问题,这是我们在明确知道要进行排序的对象数组的情况,倘若对象数组元素不存在age属性,那就会报错了,因此,你在撰写自己的规则时,应该更加丰富它的规则判断。

加入我们现在不规定按照哪一个属性排序,比如除了age属性,我们还有学生的分数score属性,我们偶尔需要按照年龄排序,偶尔又需要按照score排序,希望能重复用这个算法,应该怎么办呢?

function sortBy(field) {
  return function(a,b) {
    return a[field] - b[field];
  }
}
arr1.sort(sortBy("score"));

 

没错,核心的代码就这么简单了,一些可能抛出错误的判断,自己去考虑吧。在这种想法下面,我们还可以做一个设想:假如score相等的情况下,我们是否可以按照年龄的大小排序输出?

function sortBy(field1, field2) {
  return function(a, b) {
    if(a[field1] === b[field1]) return a[field2] - b[field2];
    return a.field1 - b.field1;
  }
}
arr1.sort(sortBy("score", "age"));

 

没错,其实也就这么简单,你甚至可以使用argments来获取更多的参数,用以传入更多的字段作为判断条件。

 

 

以上是关于sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Javascript中数组重排序方法详解

JavaScript学习笔记:数组的sort()和reverse()方法

sort()函数详解

Javascript基本数组方法详解

Javascript学习之数组详解

javascript函数setInterval和setTimeout的使用区别详解