【问题标题】:Using lodash orderBy or sortBy and handling null values使用 lodash orderBy 或 sortBy 并处理空值
【发布时间】:2018-08-03 23:12:02
【问题描述】:

我在使用 sortBy 或 orderBy 按名称对数组数组进行排序时遇到问题,其中名称可能为空。我希望能够按名称按升序(A-Z)排序,最后是空值。

目前我的代码:

_sortBy(myArray, objectA => objectA.name)

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

提前感谢您的帮助。

【问题讨论】:

  • 您可以发布您的数据样本吗?因为 _.sortBy(people, x => x.name) 和 lodash 4.17.10 完全符合您的要求。其中人 = [{name: 'Bob'}, {name: null}, {name: 'Alex'}]
  • 您确定您姓名的字符(如果不是 null)将在“A-Z”内而不是特殊字符?

标签: javascript lodash


【解决方案1】:

假设您的输入是这样的:

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 11thlocaleCompare 也可以是 give you options 在外壳等方面。

【讨论】:

    【解决方案2】:

    这个解决方案对我有用,可以处理字符串、数字、布尔值和日期。

    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"]
    );
    

    【讨论】:

      【解决方案3】:

      在原版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>

      【讨论】:

        猜你喜欢
        • 2019-03-22
        • 2019-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-12
        • 1970-01-01
        相关资源
        最近更新 更多