Как использовать Lodash orderby с пользовательской функцией? - PullRequest
0 голосов
/ 02 сентября 2018

Я использую Lodash's orderby для сортировки ряда элементов на основе ключевого свойства.

Я хочу назначить им приоритет по другому свойству (емкости) с числом от 0 до 9. В конце должны быть отсортированы элементы с 0 емкостью, а все остальные элементы должны быть отсортированы по ключу.

Таким образом, свойство емкости должно быть преобразовано в логическое значение. Я хочу сделать это без изменения исходного объекта или добавления нового свойства или создания нового массива.

Пример данных:

    [
      {
        "priceChild": 4098000,
        "priceAdult": 4098000,
        "priceInfant": 998000,
        "displayIndex": 4,
        "capacity": 5
      },
      {
        "priceChild": 3698000,
        "priceAdult": 3698000,
        "priceInfant": 898000,
        "displayIndex": 5,
        "capacity": 1
      },
      {
        "priceChild": 3006000,
        "priceAdult": 3980000,
        "priceInfant": 461000,
        "displayIndex": 6,
        "capacity": 0
      },
      {
        "priceChild": 4912000,
        "priceAdult": 6522000,
        "priceInfant": 715000,
        "displayIndex": 7,
        "capacity": 9
      }
    ]

Это функция сортировки, которую я сейчас использую:

orderBy(results, 'displayIndex', 'asc');

Я хочу сделать что-то подобное, но этот код не будет работать, потому что троичный оператор не будет работать для каждого элемента:

orderBy(results, [this.capacity === 0 ? true : false, 'displayIndex'], ['asc', 'asc']);

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Обнаружено, что есть возможность использовать функции внутри свойств orderby:

orderBy(results, [function(resultItem) { return resultItem.capacity === 0; }, 'displayIndex'], ['asc', 'asc']);
0 голосов
/ 02 сентября 2018

Я только что сделал ниже фрагменты кода, его работа отлично. Пожалуйста, проверьте и дайте мне знать. Вы можете реализовать логику емкости внутри функции карты.

const sample = [
    {
        priceChild: 4098000,
        priceAdult: 4098000,
        priceInfant: 998000,
        displayIndex: 4,
        seat: 5
    },
    {
        priceChild: 3698000,
        priceAdult: 3698000,
        priceInfant: 898000,
        displayIndex: 5,
        seat: 1
    },
    {
        priceChild: 3006000,
        priceAdult: 3980000,
        priceInfant: 461000,
        displayIndex: 6,
        seat: 0
    },
    {
        priceChild: 4912000,
        priceAdult: 6522000,
        priceInfant: 715000,
        displayIndex: 7,
        seat: 9
    }
];

const randomNumber = () => Math.floor(Math.random() * 9);
const copy = sample.map(obj => ({ ...obj, ...{ capacity: randomNumber() } }));
const result = _.orderBy(copy, ["capacity"], "desc");
...