我在使用sortBy或orderBy按名称对数组数组进行排序时遇到麻烦,其中name可能为null。我希望能够按名称以升序(A-Z)排序,并在末尾使用空值。
当前我的代码:
_sortBy(myArray, objectA => objectA.name)
将在开头返回空值,然后在其后继续对具有名称值的对象进行排序。
在此先感谢您的帮助。
答案 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。