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

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

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

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

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

Array.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);//[6, 11, 14, 23, 67, 87]

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

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

上面的函数只能对age进行排序,我们再优化一下:

//这样就能通过传不同的参数而有选择性的排序了
function sortBy(field) {
    return function(a,b) {
        return a[field] - b[field];
    }
}
arr1.sort(sortBy("score"));
arr1.sort(sortBy("age"));

在这种想法下面,我们还可以做一个设想:假如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"));

没错,其实也就这么简单。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章