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

广告位招租
扫码页面底部二维码联系

在javascript中,对象和数组是两【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】种不同的类型,这和php中的数组概念不同【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】。在javascript中,也有一些精妙【原创不易,请尊重版权】【转载请注明来源】的算法,用来对一些对象进行排序。我在面试【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】迅雷的时候,也拿到一道题,当时做题的时候【作者:唐霜】本文版权归作者所有,未经授权不得转载。考虑到时间,没有去仔细研究,回来后再读了【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】一些方法,就知道真正的考点在哪里了。

原创内容,盗版必究。【版权所有】唐霜 www.tangshu原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.netang.net本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】

我们现在有一组“学生”对象,包含“名字,本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】年龄”等属性,现在要求一个算法,把这些对【版权所有,侵权必究】未经授权,禁止复制转载。象放在一个数组里,可以实现按照年龄对这些【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】对象进行排序。

【版权所有】唐霜 www.tangshu【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.netang.net【未经授权禁止转载】【版权所有】唐霜 www.tangshu转载请注明出处:www.tangshuang.net【本文受版权保护】ang.net本文版权归作者所有,未经授权不得转载。
var sdts = [
  { name:"小明", age:12 },
  { name:"小红", age:13 },
  { name:"小花", age:11 }
]

那么考点在哪里呢?实际上在于数组对象的s【本文受版权保护】【本文受版权保护】ort方法。

未经授权,禁止复制转载。【作者:唐霜】【作者:唐霜】【转载请注明来源】
sdts.sort(fun)

fun是一个函数,排序根据这个函数返回值著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】来进行判断,如果返回值小于0表示两个元素【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。不需要交换位置,1表示要用交互位置,0表【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net示相等,实际上<=0等效。

【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。转载请注明出处:www.tangshua原创内容,盗版必究。【未经授权禁止转载】ng.net

sort方法有两个注意点:

【版权所有】唐霜 www.tangshu著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。ang.net未经授权,禁止复制转载。【本文首发于唐霜的博客】【访问 www.tangshuang.n【转载请注明来源】著作权归作者所有,禁止商业用途转载。et 获取更多精彩内容】
  1. 会操作原始数组,经过操作后原始数组发生变原创内容,盗版必究。【版权所有,侵权必究】
  2. 【转载请注明来源】【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshua转载请注明出处:www.tangshuang.net【作者:唐霜】ngnet】
  3. 默认排序按照字符编码排序,例如,我们有下【转载请注明来源】【原创内容,转载请注明出处】面的一个例子:
  4. 【作者:唐霜】未经授权,禁止复制转载。【转载请注明来源】
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;
}

当然,这样写会遇到一些问题,这是我们在明【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。确知道要进行排序的对象数组的情况,倘若对【版权所有,侵权必究】【本文首发于唐霜的博客】象数组元素不存在age属性,那就会报错了转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。,因此,你在撰写自己的规则时,应该更加丰本文版权归作者所有,未经授权不得转载。【转载请注明来源】富它的规则判断。

未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。

加入我们现在不规定按照哪一个属性排序,比原创内容,盗版必究。【本文受版权保护】如除了age属性,我们还有学生的分数sc【本文首发于唐霜的博客】原创内容,盗版必究。ore属性,我们偶尔需要按照年龄排序,偶【原创不易,请尊重版权】原创内容,盗版必究。尔又需要按照score排序,希望能重复用【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】这个算法,应该怎么办呢?

转载请注明出处:www.tangshua【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。ng.net【转载请注明来源】著作权归作者所有,禁止商业用途转载。
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"));

没错,其实也就这么简单,你甚至可以使用a原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】rgments来获取更多的参数,用以传入本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】更多的字段作为判断条件。

【版权所有】唐霜 www.tangshu本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。ang.net原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【转载请注明来源】

2016-04-25 16567

为价值买单,打赏一杯咖啡

本文价值165.67RMB
已有3条评论
  1. yzbh007 2018-07-16 13:17

    function sortBy(field1,field2) {
    return function(a,b) {
    if(a.field1 == b.field1) return a.field2 – b.field2;
    return a.field1 – b.field1;
    }
    }
    arr.sort(sortBy(“score”,”age”));

    这样写,结果不正确!

    正确的如下
    function sortBy(field1,field2) {
    return function(a,b) {
    if(a[field1] == b[field1]) return a[field2] – b[field2];
    return a[field1] – b[field1];
    }
    }
    arr.sort(sortBy(“score”,”age”));

    • 否子戈 2018-07-16 16:14

      谢谢纠正,已经在文章中改过来了

  2. andy 2017-06-24 10:34

    很有帮助,谢谢!