Сортировка массива строк с пользовательским порядком - PullRequest
0 голосов
/ 09 апреля 2019

Когда вы сортируете массив, скажем:

const arr = ["bad", "good", "all", "ugly"]

с arr.sort () ответ имеет тенденцию быть:

arr = ["all", "bad", "good", "ugly"]

но что, если мне понадобится заказ, например:

arr = ["bad", "good", "ugly", "all"]

т.е. для примера вам нужно поместить элемент "all" в конец отсортированного массива вместо начала

Я отсортировал массив, а затем удалил элемент «all» из массива, чтобы добавить его в конец, т.е.

const a = _.pull(arr, "all");
a.splice(3, 0, "all")
console.log(a)     // ["bad", "good", "ugly", "all"]

Есть ли лучший или менее сложный способ сделать то же самое?

Ответы [ 3 ]

5 голосов
/ 09 апреля 2019

Вы можете использовать собственный компаратор для сортировки.Что-то вроде

[...arr].sort((x, y) => x === 'all' ? 1 : y === 'all' ? -1 : x.localeCompare(y))

const arr = ["bad", "good", "all", "ugly"];
console.log([...arr].sort((x, y) => x === 'all' ? 1 : y === 'all' ? -1 : x.localeCompare(y)))
0 голосов
/ 09 апреля 2019

я думаю, что ниже одного - праздный.Потому что, сортируя себя, вы можете тянуть «все» до конца

let list = ["all", "bad", "good", "ugly"]
list.sort((a, b) => {
    if(a === 'all') {return 1;}
    if(b === 'all') {return -1;}
    if(a < b) { return -1; }
    if(a > b) { return 1; }
    return 0
})
console.log(list)
0 голосов
/ 09 апреля 2019

Вы можете сделать что-то подобное, используя оператор ИЛИ:

let arr = ["all", "bad", "all", "good", "ugly"]

arr.sort((a, b) => (a == "all") - (b == "all") || a.localeCompare(b))

console.log(arr)

Вычитание логических значений возвращает число (true - false === 1).Если одна строка - "all", второе условие вообще не проверяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...