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方法有两个注意点:
- 会操作原始数组,经过操作后原始数组发生变化
- 默认排序按照字符编码排序,例如,我们有下面的一个例子:
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"));
没错,其实也就这么简单。