javascript сортировка option и value по алфавиту
На странице есть списки например
Код:
<select multiple="multiple">Как выстроить эти списки по алфавиту(с сохранением value и selected у option) при загрузке страницы, чтобы получалось так Код:
<select multiple="multiple"> |
<select multiple="multiple">
<option value="2" selected="selected">С отделкой</option>
<option value="3">Без отделки</option>
</select>
<select multiple="multiple">
<option value="2" selected="selected">Банан</option>
<option value="3">Абрикос</option>
<option value="4">Зелень</option>
</select>
<script>
document.querySelectorAll('select').forEach(sel=>{
[...sel.children].sort((a,b)=> a.text > b.text ? 1 : a.text < b.text ? -1 : 0).forEach(el=>sel.appendChild(el));
});
</script>
|
mopsusha,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
var select = document.querySelectorAll("select");
[].forEach.call(select, function(sel) {
[].slice.call(sel.options, 0).sort(function(a, b) {
return a.text > b.text ? 1 : a.text < b.text ? -1 : 0
}).forEach(function(o) {
sel.appendChild(o)
})
})
});
</script>
</head>
<body>
<select multiple="multiple">
<option value="2" selected="selected">С отделкой</option>
<option value="3">Без отделки</option>
</select>
<select multiple="multiple">
<option value="2" selected="selected">Банан</option>
<option value="3">Абрикос</option>
<option value="4">Зелень</option>
</select>
</body>
</html>
|
j0hnik,
sort без return -1, не айс |
рони,
Какие нюансы? |
Цитата:
|
рони,
можете примерчик такого поведения черкануть? |
j0hnik,
документации по sort, разве недостаточно? |
рони,
если не сложно уделите минутку... ;) |
j0hnik,
<script>
var str = "12345678901234567890";
for (var i = 0; i < 50; i++) {
document.write("<br>"+str.split("").sort(function() {
return Math.random() > 0.5
}).sort(function(a,b) {
return a > b
})) //ожидаемый результат 0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9
}
</script>
|
рони,
спасибо, вник в суть, к массивам больше 10 ячеек v8 применяет какую-то оптимизацию. |
j0hnik,
да, да наплевать на документацию, это Google Chrome и Internet Explorer плохие, раз придерживаются правил ))) |
рони,
IE придерживается и даж поддержка новых стандартов появляется спустя 3-4 года, а так да, хороший арбуз! |
j0hnik,
c return -1 работает везде
<script>
var str = "12345678901234567890";
for (var i = 0; i < 50; i++) {
document.write("<br>"+str.split("").sort(function() {
return Math.random() > 0.5
}).sort(function(a,b) {
return a > b ? 1 : a < b ? -1 : 0
})) //ожидаемый результат 0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9
}
</script>
|
рони, да знаю
|
:write: :) или так
<script>
var str = "12345678901234567890";
for (var i = 0; i < 50; i++) {
document.write("<br>"+str.split("").sort(function() {
return Math.random() > 0.5
}).sort(function(a,b) {
return a > b || -(a < b)
})) //ожидаемый результат 0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9
}
</script>
|
рони,
а почему бы не так тогда (7-я строка)?)) return a > b || -1 |
:lol: или так
<script>
var str = "12345678901234567890";
for (var i = 0; i < 50; i++) {
document.write("<br>"+str.split("").sort(function() {
return Math.random() > 0.5
}).sort(function(a,b) {
return a.localeCompare(b,"ru")
})) //ожидаемый результат 0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9
}
</script>
|
Цитата:
|
а зачем? Поменяются местами 5 и 5, это же не ошибка
|
Цитата:
|
Цитата:
|
Ну тогда так)):
return a - b; |
Цитата:
|
Manyasha,
Array/sort |
Manyasha,
<script>
var stringArray = ['Банан', 'Абрикос', 'Зелень'];
stringArray.sort(function(a,b) {
return a - b
})
document.write(stringArray + " false <br>")
stringArray.sort() //по умолчанию сортировка строк a > b ? 1 : a < b ? -1 : 0
document.write(stringArray + " true")
</script>
|
Цитата:
маленькие массивы сортируются каким-то другим методом, который быстрее если мало элементов. |
Alexandroppolus,
наоборот, для маленьких оптимизации нет, для больших есть. помните эту кату с самописным реверсом?? |
j0hnik,
помню, только она тут не при чем. на больших массивах быстрая сортировка уделывает все остальные, потому что она асимптотически выгоднее. На маленьких асимптотика работает слегка по другому (разница между n*n и n*ln(n) копеечная, в итоге начинают рулить коэффициенты), и какой-нибудь "пузырёк" может оказаться быстрее. а так - оптимизация есть в обоих случаях. Ну и что, что массив маленький. А если надо отсортировать миллион таких маленьких? потому всё ускорено по максимуму |
https://jsperf.com/45435435tret больший по размерам массив сортируется быстрей. в хроме
console.log([0,1,2,3,4,5,6,7,8,9].sort((a,b)=>b)); //логичное поведение console.log([0,1,2,3,4,5,6,7,8,9,1].sort((a,b)=>b)); //не логичное |
Alexandroppolus,
может и есть но, с маленьким вроде все логично выводит, а там пытается "хитрить" |
Цитата:
var a = ['11-05-2018', '12-05-2017', '10-04-2017'];
a.sort();
alert(a);
alert('12-05-2017' > '11-05-2018')
Опасно так все строки сортировать ;) |
laimas,
ты сортируешь строки, а результат хочешь как от даты, в строках "8" больше чем "20" |
Цитата:
Такие же проблемы могут быть и просто с числами (уберите дефисы, результат не лучше будет, так как это строки). А есть еще понятие "натуральная сортировка", в JS готовой функции для нее тоже нет. |
laimas,
не осилил |
Цитата:
Ну например есть массив имен файлов, которые надо отсортировать: var a = ["img12.png", "img10.png", "img2.png", "img1.png"]; a.sort(); alert(a); и получим не то чего бы хотелось - img1.png, img2.png, img10.png, img12.png. Проблема в том, что сравнение a > b будет косячит с числами. |
laimas,
спасибо, но я пас. |
Цитата:
var a = ["img12.png", "img10.png", "img2.png", "img1.png"];
a.sort(function(a,b) {
return a.match(/\d+/)[0] - b.match(/\d+/)[0]
});
alert(a);
|
Цитата:
Проверьте свой код с таким, например, массивом: ["iag12.png", "iq10.png", "img2.png", "img1.png"] - с цифрами все будет Ок, но ведь не верно же будет. ) |
Цитата:
|
| Часовой пояс GMT +3, время: 20:21. |