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

时间:2016-12-14 09:18:28

标签: javascript typescript lodash

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

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

_.orderBy(this.myArray, ['propertyName'], ['desc']);

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

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

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

有谁知道如何处理这个问题?

7 个答案:

答案 0 :(得分:13)

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



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

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

console.log(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>
&#13;
&#13;
&#13;

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

propertyName || ''

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

propertyName === null ? '' : propertyName

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

仅供以后参考,您可以执行此操作以最后以falsey值升序进行排序。

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

答案 3 :(得分:0)

我看起来像这样。 PropName和sort都是我的解决方案中的变量

return _.orderBy( myarray, [
  ( data ) => {
    if ( data[propName] === null ) {
        data[propName] = "";
    }
    return data[propName].toLowerCase();
    }
 ], [sort] );

我想要tolowercase,否则如果不同的外壳

则排序不正确

答案 4 :(得分:0)

这会将错误的值放在底部,并区分数字和字符串。

const items = [] // some list

const goodValues = isAscending => ({ value }) => {
    if (typeof value !== 'string' && isNaN(value)) {
        return isAscending ? Infinity : -Infinity
    }

    return value || ''
}

const sortedItems = orderBy(
    items,
    [goodValues(isAscending), 'value'],
    [isAscending ? 'asc' : 'desc']
)

答案 5 :(得分:0)

这对我有用

orders = [{id : "1", name : "test"}, {id : "1"}];
sortBy = ["id", "name"];
orderby(
            orders,
            sortBy.map(s => {
                return (r: any) => {
                    return r[s] ? r[s] : "";
                };
            })),
        );

答案 6 :(得分:-1)

我们可以将数组分成两部分:一个 - 有空值,另一个 - 没有。然后对不带空值的数组进行排序,并在末尾附加带空值的数组 [...rows] 创建数组的副本以避免弄乱我仍然在应用程序中的其他地方使用的原始数组

static doSort(rows, fieldName, sortDirection, nullslast) {
    if (!nullslast) {
        return _.orderBy([...rows], [fieldName], [sortDirection]);
    }
    const withoutNulls = [];
    const withNulls = [];
    for (let row of rows) {
        (row[fieldName] === null ? withNulls : withoutNulls).push(row);
    }
    return _.orderBy([...withoutNulls], [fieldName], [sortDirection]).concat(withNulls);
}