javascript中对一个对象数组按照对象某个属性进行排序

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

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

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

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

Array.sort(fun)

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

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相等的状况下,咱们是否能够按照年龄的大小排序输出?.net

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来获取更多的参数,用以传入更多的字段做为判断条件。

 

 

转载来自:http://www.tangshuang.net/2406.html。

干活蛮足的。

相关文章
相关标签/搜索