[英]Using lodash orderBy or sortBy and handling null values
我在使用 sortBy 或 orderBy 按名称对数组数组进行排序时遇到问题,其中 name 可能为 null。 我希望能够按名称按升序 (AZ) 排序,最后为空值。
目前我的代码:
_sortBy(myArray, objectA => objectA.name)
将返回开头的空值,然后继续对具有名称值的对象进行排序。
预先感谢您的任何帮助。
让我们假设您的输入是这样的:
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
还会为您提供有关外壳等的选项。
在 vanilla 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>
这个解决方案对我有用,可以处理字符串、数字、布尔值和日期。
import { get, orderBy } from "lodash";
const items = [
{ id: 1, firstName: null, enabled: true, age: 30 },
{ id: 2, enabled: true, age: 31 },
{ id: 3, firstName: "", enabled: true, age: null },
{ id: 4, firstName: "A", enabled: false, age: undefined },
{ id: 5, firstName: "a", enabled: null, age: 10 },
{ id: 6, firstName: "b", enabled: undefined, age: 11 }
];
const sortIterate = (item, property) => {
// Null will be returned for any undefined values
const value = get(item, property, null);
// If value is null set to empty string to get proper sort order
// Works if comparing against strings, numbers, booleans, and dates.
return value === null ? "" : value;
};
// Single sort example
const orderedArray = orderBy(
items,
[(item) => sortIterate(item, "firstName")],
["asc"]
);
// Multi sort example
const multiOrderedArray = orderBy(
items,
[
(item) => sortIterate(item, "firstName"),
(item) => sortIterate(item, "age")
],
["asc", "desc"]
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.