Lodash-在数字字段上使用_.orderBy时如何忽略零?

时间:2020-02-13 12:39:27

标签: node.js lodash

用户列表-

const users = [
    {
        name: "user1",
        active: true,
        limit: 5
    },
    {
        name: "user2",
        active: true
    },
    {
        name: "user3",
        active: true
    },
    {
        name: "user4",
        active: true,
        limit: 2
    },
    {
        name: "user5",
        active: true,
        limit: 0
    }
];

此处,limit值较低的用户必须首先出现(限制的升序),而没有limit的用户必须按字母顺序排序。但是拥有limit = 0的用户应属于后一种(字母排序)。

在Node.js中使用lodash库进行排序的代码-

import * as _ from "lodash";
const sortedUsers = _.orderBy(users, ["limit", "name"], ["asc", "asc"]);

使用上述代码输出-

[
    {
        name: "user5",
        active: true,
        limit: 0
    },
    {
        name: "user4",
        active: true,
        limit: 2
    },
    {
       name: "user1",
       active: true,
       limit: 5
    },

    {
        name: "user2",
        active: true
    },
    {
        name: "user3",
        active: true
    }
]

但是预期输出是-

[
    {
        name: "user4",
        active: true,
        limit: 2
    },
    {
       name: "user1",
       active: true,
       limit: 5
    },
    {
        name: "user2",
        active: true 
    },
    {
        name: "user3",
        active: true
    },
    {
        name: "user5",
        active: true,
        limit: 0
    }
]

2 个答案:

答案 0 :(得分:0)

如果将用户限制设置为字符串而不是数字('0''2''5'),则顺序是相同的。

但是您可以提供函数而不是直接提供名称,因此您可以破解:

const sortedUsers = _.orderBy(
  users,
  [
    (a) => {
      return a.limit ? a.limit : undefined;
    },
    'name'
  ],
  ["asc", "asc"]
);

这样,0最终将被视为(仅出于订购目的)与undefined相同,后者将0值的对象放在订单的末尾。

答案 1 :(得分:0)

您可能不需要lodash进行这项简单的工作。如果仍要使用lodash,请在lodash参数中使用相同的sort函数。

const users = [
    {
        name: "user1",
        active: true,
        limit: 5
    },
    {
        name: "user2",
        active: true
    },
    {
        name: "user3",
        active: true
    },
    {
        name: "user4",
        active: true,
        limit: 2
    },
    {
        name: "user5",
        active: true,
        limit: 0
    }
];

const sortedData = users.sort(({limit = 0}, {limit:yLimit = 0} )=> {
    return yLimit - limit
})
console.log(sortedData)

相关问题