Javascript Sort SELECT Elements - PullRequest
0 голосов
/ 13 июля 2010

Есть ли простой способ сортировки списка элементов HTML Select в Javascript?Я бы хотел, чтобы это было отсортировано по их именам.Каждый элемент Select имеет другие поля, такие как заголовок и значение.Должен ли я использовать массивы?

Ответы [ 4 ]

2 голосов
/ 14 июля 2010

Причины, по которым вам следует использовать массивы:

  • NodeLists доступны только для чтения (к ним нельзя применить сортировку массива)
  • Операции с массивами выполняются очень быстро по сравнению с операциями DOM

Таким образом, вам необходимо преобразовать параметры в массив, а затем применить к нему функцию sort с помощью пользовательской функции сравнения. Наконец, вы добавляете элементы обратно в правильном порядке.

Использование

sortSelect("selection_id");

Код [ Посмотреть в действии ]

(function(window){

// array functions are not working
// on nodeLists on IE, we need to
// to convert them to array
function toArray( obj ) {
  var i, arr = [];
  for ( i = obj.length; i--; ){
    arr[i] = obj[i];
  }
  return arr;
}

// custom compare function for sorting
// by the option's value
function sortByName( a, b ) {
  if ( a.value < b.value ) return -1;
  else if( a.value > b.value ) return 1;
  else return 0;
}

window.sortSelect = function(id) {

  // select the elements to be ordered
  var sel   = document.getElementById(id),
      items = sel.getElementsByTagName("option"),
      len   = items.length;

  // convert to array, to make sorting possible
  items = toArray( items );

  // do the item sorting by their value
  items = items.sort( sortByName );

  // append them back to the parent in order
  for ( var i = 0; i < len; i++ ) {
    sel.appendChild( items[i] );
  }
};

})(this);​

Проверено на: IE5.5 +, FF2 +, Chrome, Opera 9.6 +

1 голос
/ 13 июля 2010

Я бы использовал массивы:

var x = [];
var select = document.getElementById('mySelect');
var length = select.options.length;
for(var i=length-1; i>=0; --i) {
   x.push(select.options[i]);
   select.removeChild(select.options[i]);
}
x.sort(function(o1,o2){
   if(o1.value > o2.value) {
      return 1;
   } else if(o1.value < o2.value) {
      return -1;
   }
   return 0;
});
for(var i=0; i<length; ++i) {
   select.appendChild(x[i]);
}
0 голосов
/ 22 июля 2013
<script type="text/javascript">
function Sort1()
{
var x1 = document.getElementById('s1');
var x2= new Array();
for(i=0;i<x1.length;i++)
{
 x2.push(x1[i].value);  
}

x2.sort();
x1.length=0;

for(i=0;i<x2.length;i++)
{
document.f1.s1[i]=new Option(x2[i],x2[i]);
}
}
</script>
<body>
<select id="s1" name="s1">
<option value="Sachin">Sachin</option>
<option value="Sehwag">Sehwag</option>
<option value="Zahir">Zahir</option>
<option value="Dhoni">Dhoni</option>

</select><br />
<input type="button" value="Sort" onclick="Sort1()" /><br />
</form>
</body>
0 голосов
/ 05 марта 2012

Все глючные решения .. либо из-за плохого индекса, либо из-за плохой обработки символов ..

Рабочий раствор. Добавьте Unicode, где это необходимо. True Bubble Sort

//tjcoder
function sortlist(cl){
    var chars = "0123456789abcdefghijklmnopqrstuvwxyz";
    for(var i=0;i<cl.length-1;i++){
        if(chars.indexOf(cl.options[i].text.substr(0,1).toLowerCase())>chars.indexOf(cl.options[i+1].text.substr(0,1).toLowerCase())){
            var tmp=cl.options[i].text;
            cl.options[i].text=cl.options[i+1].text;
            cl.options[i+1].text=tmp;
            i=-1;
        }
    }
}

P.S. Я прокомментировал, потому что это высокий уровень поисковых индексов для сортировки параметров поиска, и все решения для ответов содержат ошибки.

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