Jquery по условию
Необходимо сделать следующую сортировку
HTML Сейчас
<select id="moId" name="moId">
<option value="0" selected="selected"> </option>
<option value="1">640001 А</option>
<option value="2">640002 М</option>
<option value="3">640003 Т (не действует в 2020)</option>
<option value="4">640004 О (не действует в 2019)</option>
<option value="5">640005 М (не действует в 2021)</option>
<option value="6">640006 Л</option>
</select>
Как нужно
<select id="moId" name="moId">
<option value="0" selected="selected"> </option>
<option value="1">640001 А</option>
<option value="2">640002 М</option>
<option value="6">640006 Л</option>
<option value="3">640003 Т (не действует в 2020)</option>
<option value="4">640004 О (не действует в 2019)</option>
<option value="5">640005 М (не действует в 2021)</option>
</select>
В данном примере сортирует не так как нужно
//
<script>
$(function () {
var sel = $("#moId"), opts = $("#moId option");
opts.sort(function (a, b) {
var re = /\(не действует в 20.*\)$/;
if (re.test(a.textContent)) {
if (!re.test(a.textContent)) return 1;
} else {
if (re.test(b.textContent)) return -1;
}
return 0;
});
$.each(opts, function (k, v) {
sel.append(v);
});
});
</script>
//
Ответы (2 шт):
Автор решения: Алексей Шиманский
→ Ссылка
Думаю тут надо немного поменять подход. Не важно, генерируется ли html через сервер или клиент, но:
- Надо формировать
optionтаким образом, чтобы каждый элемент имелdata-атрибут с ключевывым свойством. напримерdata-active, куда заносить данные при формировании html. Например будетdata-active="1"иdata-active="0" - Применить сортировку на основе атрибута. что гораздо проще, чем выяснять регулярками есть ли какой-то текст или нет.
Автор решения: prit
→ Ссылка
const res = $('#moId option').sort((a,b) => {
if(/\(не действует в 20.*\)$/.test(a.textContent)) return 0;
if(!b.textContent.trim()) return 1;
return -1;
});
$('#moId').html('').append(res)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="moId" name="moId">
<option value="0" selected="selected"> </option>
<option value="1">640001 А</option>
<option value="2">640002 М</option>
<option value="3">640003 Т (не действует в 2020)</option>
<option value="4">640004 О (не действует в 2019)</option>
<option value="5">640005 М (не действует в 2021)</option>
<option value="6">640006 Л</option>
</select>