Сортировать HTML Выбрать по частичному тексту - PullRequest
0 голосов
/ 27 апреля 2018

Мне нужно отсортировать элементы по частям текста на основе дефисов в тексте. Например:

<select id="mySelect">
    <option value="1">Oranges - Box A - Deliver</option>
    <option value="2">Apples - Box A - Deliver</option>
    <option value="3">Bananas - Box B - Deliver</option>
</select>

Мне нужно отсортировать элементы по тексту после первого дефиса, а затем отсортировать по начальному тексту до первого дефиса.

Сортированный результат будет выглядеть так:

<select id="mySelect">
    <option value="2">Apples - Box A - Deliver</option>
    <option value="1">Oranges - Box A - Deliver</option>
    <option value="3">Bananas - Box B - Deliver</option>
</select>

Итак, его нужно отсортировать по имени ящика, а затем по фрукту. Я использую следующий вид, но он использует весь текст.

function sortAllItems(listname) {
    var $r = $(listname + " option");
    $r.sort(function (a, b) {
        return (a.text).localeCompare(b.text);
    });
    $(listname).append($($r));
}

Я уверен, что есть какой-то хитрый способ найти вместе дефис и подстроки, но я не смог придумать что-то, что работает.

Кто-нибудь должен был делать что-то сумасшедшее, как это раньше? Я ценю ваш вклад. Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вы можете использовать следующий обратный вызов :

function (a, b) {
   return (a.text.split('-')[1]+a.text).localeCompare(b.text.split('-')[1]+b.text);
}

Это основано на доказательстве того, что если вы сортируете список по алфавиту и одно и то же слово появляется несколько раз в разных позициях, то только первое из них будет иметь эффект.

Итак:

Box A - Oranges - Box A - Deliver
Box A - Apples - Box A - Deliver
Box B - Bananas - Box B - Deliver

Будет сортироваться так же, как:

Box A - Oranges - Deliver
Box A - Apples - Deliver
Box B - Bananas - Deliver

Я повторяю концепцию еще раз, если одно и то же слово появляется в нескольких позициях, имеет значение только первое.

0 голосов
/ 27 апреля 2018

Должна работать двойная сортировка по частям:

$r.sort(function (a, b) {
    return (a.text.split(" - ")[1]).localeCompare(b.text.split(" - ")[1]);
});

$r.sort(function (a, b) {
    return (a.text.split(" - ")[0]).localeCompare(b.text.split(" - ")[0]);
});
...