Когда вы сортируете массив, скажем:
const arr = ["bad", "good", "all", "ugly"]
с arr.sort() ответ имеет тенденцию быть:
arr = ["all", "bad", "good", "ugly"]
но что, если мне нужен индивидуальный заказ, например:
arr = ["bad", "good", "ugly", "all"]
т.е. ради примера вам нужно нажать "все" элемент в конец отсортированного массива вместо начала
Что я сделал, так это отсортировал массив, а затем удалил элемент «все» из массива только для того, чтобы добавить его в конце, т.е.
const a = _.pull(arr, "all");
a.splice(3, 0, "all")
console.info(a) // ["bad", "good", "ugly", "all"]
Есть ли лучший или менее сложный способ сделать то же самое?
Пожалуйста, добавьте, какой заказ вам нужен. на самом деле похоже, что вы хотите иметь фиксированный порядок элементов.
Вы можете использовать пользовательский компаратор для сортировки. Что-то типа
[...arr].sort((x, y) => x === 'all' ? 1 : y === 'all' ? -1 : x.localeCompare(y))
const arr = ["bad", "good", "all", "ugly"];
console.info([...arr].sort((x, y) => x === 'all' ? 1 : y === 'all' ? -1 : x.localeCompare(y)))
Вы можете сделать что-то подобное, используя оператор ИЛИ:
let arr = ["all", "bad", "all", "good", "ugly"]
arr.sort((a, b) => (a == "all") - (b == "all") || a.localeCompare(b))
console.info(arr)
Вычитание логических значений возвращает число (true - false === 1
). Если одна из строк равна "all"
, второе условие вообще не будет проверяться.
я думаю, что ниже один является холостым. Потому что при самой сортировке можно дотянуть "все" до конца
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.info(list)
есть ли причина не переобъявлять массив? это статический массив, поэтому, если вам не нужно работать с динамическими массивами, вы можете просто повторно объявить его. Я бы даже не назвал такую "сортировку", это скорее перемещение элемента в конец массива.