使用lodash orderBy或sortBy并处理空值

时间:2018-08-03 23:12:02

标签: javascript lodash

我在使用sortBy或orderBy按名称对数组数组进行排序时遇到麻烦,其中name可能为null。我希望能够按名称以升序(A-Z)排序,并在末尾使用空值。

当前我的代码:

_sortBy(myArray, objectA => objectA.name)

将在开头返回空值,然后在其后继续对具有名称值的对象进行排序。

在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

在普通js中可以做到:

data.sort((a,b)=>{
  if(a.name===b.name){
    return 0
  }else if(a.name===null || b.name===null){
    return a.name ? -1 : 1;
  }
  return a.name.localeCompare(b.name);
})
console.log(data)
<script>
 var data=[
   {name:'F'},
   {name:null},
   {name:null},
   {name:'A'}
 
 ]
</script>

答案 1 :(得分:0)

让我们假设您的输入是这样的:

var data=[
   {name:'John Alexov'},
   {name:null},
   {name:'Alex Jones'},
   {name:null}
 ]

如果名称中没有数字值,则使用简单的

_.sortBy(data, x => x.name)

_.orderBy(data, x => x.name) // since the default order is ["asc"]` 

在名称后加nulls即可为您提供所需的结果。

但是,由于某些原因,请假设名称中包含数字值:

var data=[ {name:'John Alexov'}, {name:null}, {name:'Alex Jones'}, {name:null}, {name:null}, {name:'Mark 3rd'}, {name:'Bob Marley'}, {name:'john c'}, {name:'john 11th'}, {name:'john 1st'} ]

var result = data.sort((x,y) => 
 x.name && y.name ? x.name.localeCompare(y.name, undefined, {numeric: 
 true}) : x.name ? -1 : y.name ? 1 : 0)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

然后,您将需要类似localeCompare(y.name, undefined, {numeric: true})的内容来确保john 1st is above john 11th。 外壳等方面,localeCompare也会give you options