lodash orderby,null和实际值没有正确排序

Ben*_*ron 11 javascript typescript lodash

我有一个Angular 2打字稿应用程序,它使用lodash进行各种操作.

我有一个对象数组,我使用对象中的属性进行排序...

_.orderBy(this.myArray, ['propertyName'], ['desc']);
Run Code Online (Sandbox Code Playgroud)

这很有效,但我的问题是有时'propertyName'可以有一个空值.这些作为降序列表中的第一项排序,然后是最高实际值.

我想让这些空值以降序排列显示在最后.

我理解为什么空值首先出现.

有谁知道如何处理这个?

Ori*_*ori 15

_.orderBy()迭代中使用方法而不是字符串,检查值,如果它null返回一个空字符串.

const myArray = [{ propertyName: 'cats' }, { propertyName: null }, { propertyName: 'dogs' }, { propertyName: 'rats' }, { propertyName: null }];

const result = _.orderBy(myArray, ({ propertyName }) => propertyName || '', ['desc']);

console.log(result);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

检查可以很简单,就像我使用的那样,将所有的falsy值转换为空字符串:

propertyName || ''
Run Code Online (Sandbox Code Playgroud)

如果需要更严格的检查,可以使用三元运算符,并只处理null值:

propertyName === null ? '' : propertyName
Run Code Online (Sandbox Code Playgroud)

  • 这仍然按“asc”顺序首先对空值进行排序,有没有办法让空值始终位于末尾? (3认同)
  • 为什么你需要所有额外的东西`[( o ) =&gt; { return o.myProperty || ''}]`?我的解决方案开箱即用。请参阅片段。只需将 `propertyName` 替换为属性的名称。 (2认同)

Ben*_*ron 10

我需要的代码看起来像这样......

_.orderBy(this.myArray, [( o ) => { return o.myProperty || ''}], ['desc']); 
Run Code Online (Sandbox Code Playgroud)

  • 这仍然会按asc顺序对null居留空间进行排序,是否有一种方法总是在末尾使用null? (2认同)
  • @stallingOne我知道这已经很旧了,但是对于任何试图实现这一目标的人来说,你可以尝试 _.orderBy(this.myArray, o =&gt; o || undefined) (2认同)

inf*_*ity 7

只是为了将来给其他人参考,您可以这样做,以在最后使用错误值进行升序排序。

items =>
  orderBy(
    items,
    [
      i => !!i.attributeToCheck,
      i => {
        return i.attributeToCheck ? i.attributeToCheck.toLowerCase() : ''
      }
    ],
    ['desc', 'asc']
  )
Run Code Online (Sandbox Code Playgroud)