Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用JavaScript编写排序方法的最干净的方法,该方法对多个对象属性进行排序_Javascript_Sorting - Fatal编程技术网

用JavaScript编写排序方法的最干净的方法,该方法对多个对象属性进行排序

用JavaScript编写排序方法的最干净的方法,该方法对多个对象属性进行排序,javascript,sorting,Javascript,Sorting,这是一种代码高尔夫/代码清洁和简洁的问题。我想用JavaScript对一个对象进行排序,我想知道最短最干净的方法是什么 考虑到这样的问题: 项目=[ {姓名:皮埃尔,等级:1}, {name:Burhan,boosted:false,rank:null}, {name:Ellise,boosted:false,rank:1}, {姓名:格伦,等级:2}, {name:Zidane,boosted:false,rank:null}, {姓名:安东尼娅,姓名:假,军衔:2}, ]; 我需要对这些要求

这是一种代码高尔夫/代码清洁和简洁的问题。我想用JavaScript对一个对象进行排序,我想知道最短最干净的方法是什么

考虑到这样的问题:

项目=[ {姓名:皮埃尔,等级:1}, {name:Burhan,boosted:false,rank:null}, {name:Ellise,boosted:false,rank:1}, {姓名:格伦,等级:2}, {name:Zidane,boosted:false,rank:null}, {姓名:安东尼娅,姓名:假,军衔:2}, ]; 我需要对这些要求进行分类:

首先提升项目,然后在多个提升项目中按名称升序。 下一个放置等级,升序,其中等级!=无效的如果排名平平,我们如何排序无关紧要。 当rank=null时,按名称升序排序。 所以本质上是三个bucket来对项目进行排序,然后在每个bucket中按名称排序。排名不是标准化的,它可以是任何有效的数字

上面排序的结果列表应如下所示:

排序=[ {姓名:格伦,等级:2}, {姓名:皮埃尔,等级:1}, {name:Ellise,boosted:false,rank:1}, {姓名:安东尼娅,姓名:假,军衔:2}, {name:Burhan,boosted:false,rank:null}, {name:Zidane,boosted:false,rank:null}, ]; 我写了这么长的方法:

items.sorta,b=>{ //促进 如果a.boosted和b.boosted{ 返回a.name.localeCompareb.name; }否则,如果a.boosted&&!b.boosted{ 返回-1; }否则,如果!a.boosted&&b.boosted{ 返回1; } //排名 如果a.rank!=null&&b.rank!=null{ 返回a-b; }否则,如果a.rank!=null&&b.rank==null{ 返回-1; }否则,如果a.rank==null&&b.rank!=null{ 返回1; } //默认名称 返回a.name.localeCompareb.name; }; 这是可行的,但我认为有更好的方法可以做到这一点,我很好奇其他人会推荐什么风格。我能写的最短的解决方案是什么?最干净的是什么?最快的是什么?由于排序方法在排序操作期间可能会被多次调用,因此您可以在布尔值和数字上使用-on。您可以使用| |链接多个排序条件,当第一个排序条件不返回0时短路

在你的情况下,那可能是

items.sort((a, b) =>
  b.boosted - a.boosted ||
  (a.rank == null) - (b.rank == null) ||
  a.rank - b.rank ||
  a.name.localeCompare(b.name)
);
如果您只是按优先级不同的列进行排序。但是,您有一个特殊要求,即增强项的排序应该与非增强项的排序不同,因此您确实需要加入一个条件语句:

items.sort((a, b) =>
  b.boosted - a.boosted ||
  (a.boosted
    ? a.name.localeCompare(b.name)
    : (a.rank == null) - (b.rank == null) ||
      (a.rank != null
        ? a.rank - b.rank
        : a.name.localeCompare(b.name)
      )
  )
);
你可以在布尔和数字上使用-on。您可以使用| |链接多个排序条件,当第一个排序条件不返回0时短路

在你的情况下,那可能是

items.sort((a, b) =>
  b.boosted - a.boosted ||
  (a.rank == null) - (b.rank == null) ||
  a.rank - b.rank ||
  a.name.localeCompare(b.name)
);
如果您只是按优先级不同的列进行排序。但是,您有一个特殊要求,即增强项的排序应该与非增强项的排序不同,因此您确实需要加入一个条件语句:

items.sort((a, b) =>
  b.boosted - a.boosted ||
  (a.boosted
    ? a.name.localeCompare(b.name)
    : (a.rank == null) - (b.rank == null) ||
      (a.rank != null
        ? a.rank - b.rank
        : a.name.localeCompare(b.name)
      )
  )
);

我个人是这样做的:

常数项=[ {姓名:皮埃尔,等级:1}, {name:Burhan,boosted:false,rank:null}, {name:Ellise,boosted:false,rank:1}, {姓名:格伦,等级:2}, {name:Zidane,boosted:false,rank:null}, {姓名:安东尼娅,姓名:假,军衔:2}, ]; const gKey={name,boosted,rank}=>`${boosted?0:1}{rank!=null?'000'+rank.slice-3:'999'}{name}` items.sorta,b=>gKeya.localeComparegKeyb //证明: items.forEache=>console.logJSON.stringifye,'key->',gKeye,
.作为控制台包装{最大高度:100%!重要;顶部:0;}我个人这样做:

常数项=[ {姓名:皮埃尔,等级:1}, {name:Burhan,boosted:false,rank:null}, {name:Ellise,boosted:false,rank:1}, {姓名:格伦,等级:2}, {name:Zidane,boosted:false,rank:null}, {姓名:安东尼娅,姓名:假,军衔:2}, ]; const gKey={name,boosted,rank}=>`${boosted?0:1}{rank!=null?'000'+rank.slice-3:'999'}{name}` items.sorta,b=>gKeya.localeComparegKeyb //证明: items.forEache=>console.logJSON.stringifye,'key->',gKeye,
.作为控制台包装器{max height:100%!important;top:0;}您可以将其提取到函数中。。。items.SortComparbysBoosted和rank排名可以是负数或0?是的,排名可以是负数或正数,我知道这会让事情变得更复杂。在电子表格中,我有时会因为这种排序而作弊。。。计算name/检查数据的最大字符数,计算rand/检查的最大位数,为每个对象添加一个属性,说sortKey,并将其值设置为B的串联,为boosted/X的串联,为not+name+。repeatmax chars.slice0,max chars+。repeatmax digits+rank.slice-max digits,然后按该值排序。*将0编辑为``是因为-asciis…或者,按秩排序,然后按名称排序,然后按增强:array.sortbyRank.sortbyName.sortbyBoosted,其中byXxxx是一个比较函数。您可以
d做的是把它提取成一个函数。。。items.SortComparbysBoosted和rank排名可以是负数或0?是的,排名可以是负数或正数,我知道这会让事情变得更复杂。在电子表格中,我有时会因为这种排序而作弊。。。计算name/检查数据的最大字符数,计算rand/检查的最大位数,为每个对象添加一个属性,说sortKey,并将其值设置为B的串联,为boosted/X的串联,为not+name+。repeatmax chars.slice0,max chars+。repeatmax digits+rank.slice-max digits,然后按该值排序。*由于-asciis…或按等级排序,然后按名称排序,然后按增强:array.sortbyRank.sortbyName.sortbyBoosted,其中byXxxx是一个比较函数。您可能需要再次检查输出。没有match@ibrahimmahrir哦,对了,排名应该是上升而不是下降。已修复。您可能需要再次检查输出。没有match@ibrahimmahrir哦,对了,排名应该是上升而不是下降。固定的