繁体   English   中英

使用 lodash orderBy 或 sortBy 并处理空值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM