Loda sh - Как игнорировать ноль при использовании _.orderBy по возрастанию в числовом поле? - PullRequest
0 голосов
/ 13 февраля 2020

Список пользователей -

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, должны быть в последнем порядке (по алфавиту).

Код для сортировки с использованием loda sh libarary в Node.js -

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 голосов
/ 13 февраля 2020

Вам может не понадобиться loda sh для этой простой работы. Если вы все еще хотите использовать loda sh, используйте ту же функцию сортировки в аргументе loda sh.

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)
0 голосов
/ 13 февраля 2020

Если вы устанавливаете лимит пользователей на строку вместо числа ('0', '2', '5'), порядок будет таким же.

Но вместо этого вы можете предоставить функцию непосредственно имя, так что вы можете взломать вещь:

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

Таким образом, 0 будет рассматриваться - только для целей заказа - так же, как undefined, который ставит 0 -ценные объекты в конце вашего заказа.

...