it-swarm.com.de

Javascript, um den Inhalt des ausgewählten Elements zu sortieren

gibt es eine schnelle Möglichkeit, die Elemente eines ausgewählten Elements zu sortieren? Oder muss ich auf das Schreiben von Javascript zurückgreifen?

Bitte irgendwelche Ideen.

<select size="4" name="lstALL" multiple="multiple" id="lstALL" tabindex="12" style="font-size:XX-Small;height:95%;width:100%;">
<option value="0"> XXX</option>
<option value="1203">ABC</option>
<option value="1013">MMM</option>
</select>
35
Julius A

Dies wird den Trick machen. Übergeben Sie es einfach Ihrem ausgewählten Element a la: document.getElementById('lstALL'), wenn Sie Ihre Liste sortieren möchten.

function sortSelect(selElem) {
    var tmpAry = new Array();
    for (var i=0;i<selElem.options.length;i++) {
        tmpAry[i] = new Array();
        tmpAry[i][0] = selElem.options[i].text;
        tmpAry[i][1] = selElem.options[i].value;
    }
    tmpAry.sort();
    while (selElem.options.length > 0) {
        selElem.options[0] = null;
    }
    for (var i=0;i<tmpAry.length;i++) {
        var op = new Option(tmpAry[i][0], tmpAry[i][1]);
        selElem.options[i] = op;
    }
    return;
}
64
Matty

Diese Lösung hat bei mir mit jquery sehr gut funktioniert. Ich dachte, ich würde hier darauf verweisen, da ich diese Seite vor der anderen gefunden habe. Jemand anderes könnte dasselbe tun.

$("#id").html($("#id option").sort(function (a, b) {
    return a.text == b.text ? 0 : a.text < b.text ? -1 : 1
}))

from Sortierung der Dropdown-Liste mit Javascript

38
Terre Porter

Aus dem W3C FAQ :

Obwohl viele Programmiersprachen über Dropdown-Felder verfügen, mit denen eine Liste von Elementen sortiert werden kann, bevor sie als Teil ihrer Funktionalität angezeigt werden, verfügt die HTML-Funktion <select> nicht über diese Funktionen. Es listet die <Optionen> in der Reihenfolge auf, in der sie eingegangen sind.

Sie müssten sie für ein statisches HTML-Dokument manuell sortieren oder für ein dynamisches Dokument auf Javascript oder eine andere programmatische Sortierung zurückgreifen.

4
Bill the Lizard

Ausgehend von den Antworten von Marco Lazzeri und Terre Porter (stimmen Sie ab, wenn diese Antwort nützlich ist), habe ich eine etwas andere Lösung gefunden, die den ausgewählten Wert beibehält (wahrscheinlich werden Event-Handler oder angehängte Daten jedoch nicht beibehalten) jQuery.

// save the selected value for sorting
var v = jQuery("#id").val();

// sort the options and select the value that was saved
j$("#id")
    .html(j$("#id option").sort(function(a,b){
        return a.text == b.text ? 0 : a.text < b.text ? -1 : 1;}))
    .val(v);
3
Matt K

Ich hatte das gleiche problem Hier ist die jQuery-Lösung Ich kam mit:

  var options = jQuery.makeArray(optionElements).
                       sort(function(a,b) {
                         return (a.innerHTML > b.innerHTML) ? 1 : -1;
                       });
  selectElement.html(options);
3
Marco Lazzeri

Andere Option:

function sortSelect(elem) {
    var tmpAry = [];
    // Retain selected value before sorting
    var selectedValue = elem[elem.selectedIndex].value;
    // Grab all existing entries
    for (var i=0;i<elem.options.length;i++) tmpAry.Push(elem.options[i]);
    // Sort array by text attribute
    tmpAry.sort(function(a,b){ return (a.text < b.text)?-1:1; });
    // Wipe out existing elements
    while (elem.options.length > 0) elem.options[0] = null;
    // Restore sorted elements
    var newSelectedIndex = 0;
    for (var i=0;i<tmpAry.length;i++) {
        elem.options[i] = tmpAry[i];
        if(elem.options[i].value == selectedValue) newSelectedIndex = i;
    }
    elem.selectedIndex = newSelectedIndex; // Set new selected index after sorting
    return;
}
3
user684486

Dies ist eine Zusammenfassung meiner 3 Lieblingsantworten auf diesem Forum:

  • die beste und einfachste Antwort von jok.
  • Terry Porters einfache jQuery-Methode.
  • Die konfigurierbare Funktion von SmokeyPHP.

Das Ergebnis ist eine benutzerfreundliche und leicht konfigurierbare Funktion.

Das erste Argument kann ein Auswahlobjekt, die ID eines Auswahlobjekts oder ein Array mit mindestens zwei Dimensionen sein.

Das zweite Argument ist optional. Standardmäßig wird nach Optionstext sortiert, Index 0. Es kann ein beliebiger anderer Index übergeben werden, also sortieren Sie danach. Kann 1 oder der Text "value" übergeben werden, um nach Wert zu sortieren.

Nach Textbeispielen sortieren (alle würden nach Text sortieren):

 sortSelect('select_object_id');
 sortSelect('select_object_id', 0);
 sortSelect(selectObject);
 sortSelect(selectObject, 0);

Nach Wert sortieren (alle würden nach Wert sortieren):

 sortSelect('select_object_id', 'value');
 sortSelect('select_object_id', 1);
 sortSelect(selectObject, 1);

Sortieren Sie ein Array nach einem anderen Index:

var myArray = [
  ['ignored0', 'ignored1', 'Z-sortme2'],
  ['ignored0', 'ignored1', 'A-sortme2'],
  ['ignored0', 'ignored1', 'C-sortme2'],
];

sortSelect(myArray,2);

Diese letzte Sortierung sortiert das Array nach Index-2, dem Sortme.

Hauptsortierfunktion

function sortSelect(selElem, sortVal) {

    // Checks for an object or string. Uses string as ID. 
    switch(typeof selElem) {
        case "string":
            selElem = document.getElementById(selElem);
            break;
        case "object":
            if(selElem==null) return false;
            break;
        default:
            return false;
    }

    // Builds the options list.
    var tmpAry = new Array();
    for (var i=0;i<selElem.options.length;i++) {
        tmpAry[i] = new Array();
        tmpAry[i][0] = selElem.options[i].text;
        tmpAry[i][1] = selElem.options[i].value;
    }

    // allows sortVal to be optional, defaults to text.
    switch(sortVal) {
        case "value": // sort by value
            sortVal = 1;
            break;
        default: // sort by text
            sortVal = 0;
    }
    tmpAry.sort(function(a, b) {
        return a[sortVal] == b[sortVal] ? 0 : a[sortVal] < b[sortVal] ? -1 : 1;
    });

    // removes all options from the select.
    while (selElem.options.length > 0) {
        selElem.options[0] = null;
    }

    // recreates all options with the new order.
    for (var i=0;i<tmpAry.length;i++) {
        var op = new Option(tmpAry[i][0], tmpAry[i][1]);
        selElem.options[i] = op;
    }

    return true;
}
2
Tony Chiboucas

Inspiriert von der Antwort von @Terre Porter, denke ich, dass diese sehr einfach zu implementieren ist (mit jQuery).

var $options = jQuery("#my-dropdownlist-id > option"); 
// or jQuery("#my-dropdownlist-id").find("option")

$options.sort(function(a, b) {
    return a.text == b.text ? 0 : a.text < b.text ? -1 : 1
})

Aber für Alpha/Numeric Dropdown-Listen:

Inspiriert von: https://stackoverflow.com/a/4340339/1598891

var $options = jQuery(dropDownList).find("option");

var reAlpha = /[^a-zA-Z]/g;
var reNumeric = /[^0-9]/g;
$options.sort(function AlphaNumericSort($a,$b) {
    var a = $a.text;
    var b = $b.text;
    var aAlpha = a.replace(reAlpha, "");
    var bAlpha = b.replace(reAlpha, "");
    if(aAlpha === bAlpha) {
        var aNumeric = parseInt(a.replace(reNumeric, ""), 10);
        var bNumeric = parseInt(b.replace(reNumeric, ""), 10);
        return aNumeric === bNumeric ? 0 : aNumeric > bNumeric ? 1 : -1;
    } else {
        return aAlpha > bAlpha ? 1 : -1;
    }
})

Hoffe es wird helfen

First exampleSecond example

1
RPDeshaies

Ich habe diese Bubble-Sortierung verwendet, weil ich sie nicht nach dem Wert im Options-Array ordnen konnte und es sich um eine Zahl handelte. Auf diese Weise habe ich sie richtig bestellt. Ich hoffe, es ist auch für Sie nützlich.

function sortSelect(selElem) {
  for (var i=0; i<(selElem.options.length-1); i++)
      for (var j=i+1; j<selElem.options.length; j++)
          if (parseInt(selElem.options[j].value) < parseInt(selElem.options[i].value)) {
              var dummy = new Option(selElem.options[i].text, selElem.options[i].value);
              selElem.options[i] = new Option(selElem.options[j].text, selElem.options[j].value);
              selElem.options[j] = dummy;
          }
}
1
Soledad

Ja, DOK hat die richtige Antwort ... entweder sortieren Sie die Ergebnisse vor, bevor Sie den HTML-Code schreiben (vorausgesetzt, er ist dynamisch und Sie sind für die Ausgabe verantwortlich), oder Sie schreiben Javascript.

Die Javascript Sort Methode wird dein Freund hier sein. Einfach die Werte aus der Auswahlliste ziehen, sortieren und zurücksetzen :-)

1
Joel Martinez
function call() {
    var x = document.getElementById("mySelect");
    var optionVal = new Array();

    for (i = 0; i < x.length; i++) {
        optionVal.Push(x.options[i].text);
    }

    for (i = x.length; i >= 0; i--) {
        x.remove(i);
    }

    optionVal.sort();

    for (var i = 0; i < optionVal.length; i++) {
        var opt = optionVal[i];
        var el = document.createElement("option");
        el.textContent = opt;
        el.value = opt;
        x.appendChild(el);
    }
}

Die Idee ist, alle Elemente der Auswahlbox in ein Array zu ziehen, die Auswahlboxwerte zu löschen, um ein Überschreiben zu vermeiden, das Array zu sortieren und dann das sortierte Array in das Auswahlfeld zurückzuschieben

1
Arijit Basu

Ich habe schnell eine zusammengestellt, die die Wahl der Richtung ("auf" oder "ab") erlaubt, ob der Vergleich mit dem Optionswert (wahr oder falsch) durchgeführt werden soll und ob vor dem Vergleich führende und nachfolgende Leerzeichen abgeschnitten werden sollen oder nicht (Boolean).

Der Vorteil dieser Methode ist, dass die ausgewählte Auswahl beibehalten wird und alle anderen speziellen Eigenschaften/Trigger ebenfalls beibehalten werden sollten.

function sortOpts(select,dir,value,trim)
{
    value = typeof value == 'boolean' ? value : false;
    dir = ['asc','desc'].indexOf(dir) > -1 ? dir : 'asc';
    trim = typeof trim == 'boolean' ? trim : true;
    if(!select) return false;
    var opts = select.getElementsByTagName('option');

    var options = [];
    for(var i in opts)
    {
        if(parseInt(i)==i)
        {
            if(trim)
            {
                opts[i].innerHTML = opts[i].innerHTML.replace(/^\s*(.*)\s*$/,'$1');
                opts[i].value = opts[i].value.replace(/^\s*(.*)\s*$/,'$1');
            }
            options.Push(opts[i]);
        }
    }
    options.sort(value ? sortOpts.sortVals : sortOpts.sortText);
    if(dir == 'desc') options.reverse();
    options.reverse();
    for(var i in options)
    {
        select.insertBefore(options[i],select.getElementsByTagName('option')[0]);
    }
}
sortOpts.sortText = function(a,b) {
    return a.innerHTML > b.innerHTML ? 1 : -1;
}
sortOpts.sortVals = function(a,b) {
    return a.value > b.value ? 1 : -1;
}
1
SmokeyPHP

Ich denke, dies ist eine bessere Option (ich benutze @ Mattys Code und habe sie verbessert!):

function sortSelect(selElem, bCase) {
                var tmpAry = new Array();
                bCase = (bCase ? true : false);
                for (var i=0;i<selElem.options.length;i++) {
                        tmpAry[i] = new Array();
                        tmpAry[i][0] = selElem.options[i].text;
                        tmpAry[i][1] = selElem.options[i].value;
                }
                if (bCase)
                    tmpAry.sort(function (a, b) {
                        var ret = 0;
                        var iPos = 0;
                        while (ret == 0 && iPos < a.length && iPos < b.length)
                        {
                            ret = (String(a).toLowerCase().charCodeAt(iPos) - String(b).toLowerCase().charCodeAt(iPos));
                            iPos ++;
                        }
                        if (ret == 0)
                        {
                            ret = (String(a).length - String(b).length);
                        }
                        return ret;
                        });
                else
                    tmpAry.sort();
                while (selElem.options.length > 0) {
                    selElem.options[0] = null;
                }
                for (var i=0;i<tmpAry.length;i++) {
                        var op = new Option(tmpAry[i][0], tmpAry[i][1]);
                        selElem.options[i] = op;
                }
                return;
        }
1
Matias P.

Ich hatte ein ähnliches Problem, aber ich wollte, dass die ausgewählten Elemente oben angezeigt werden und ich wollte nicht löschen, welche Elemente ausgewählt wurden (Mehrfachauswahlliste). Meins ist jQuery-basiert ...

function SortMultiSelect_SelectedTop(slt) {
    var options =
        $(slt).find("option").sort(function (a, b) {
            if (a.selected && !b.selected) return -1;
            if (!a.selected && b.selected) return 1;
            if (a.text < b.text) return -1;
            if (a.text > b.text) return 1;
            return 0;
        });
    $(slt).empty().append(options).scrollTop(0);
}

Ohne Auswahl oben würde es so aussehen.

function SortMultiSelect(slt) {
    var options =
        $(slt).find("option").sort(function (a, b) {
            if (a.text < b.text) return -1;
            if (a.text > b.text) return 1;
            return 0;
        });
    $(slt).empty().append(options).scrollTop(0);
}
1
colinbashbash

Nicht ganz so hübsch wie das JQuery-Beispiel von Marco, aber mit Prototyp (möglicherweise fehlt eine elegantere Lösung) wäre es:

function sort_select(select) {
  var options = $A(select.options).sortBy(function(o) { return o.innerHTML });
  select.innerHTML = "";
  options.each(function(o) { select.insert(o); } );
}

Und dann übergeben Sie ihm einfach ein ausgewähltes Element:

sort_select( $('category-select') );
0
Geoff

Versuchen Sie dies ... hoffentlich bietet es Ihnen eine Lösung:

function sortlist_name()
{

    var lb = document.getElementById('mylist');
    arrTexts = new Array();
    newTexts = new Array();
    txt = new Array();
    newArray =new Array();
    for(i=0; i<lb.length; i++)
    {
      arrTexts[i] = lb.options[i].text;
    }
    for(i=0;i<arrTexts.length; i++)
    {
        str = arrTexts[i].split(" -> ");
        newTexts[i] = str[1]+' -> '+str[0];
    }
    newTexts.sort();
    for(i=0;i<newTexts.length; i++)
    {
        txt = newTexts[i].split(' -> ');
        newArray[i] = txt[1]+' -> '+txt[0];
    }
    for(i=0; i<lb.length; i++)
    {
        lb.options[i].text = newArray[i];
        lb.options[i].value = newArray[i];
    }
}
/***********revrse by name******/
function sortreverse_name()
{

    var lb = document.getElementById('mylist');
    arrTexts = new Array();
    newTexts = new Array();
    txt = new Array();
    newArray =new Array();
    for(i=0; i<lb.length; i++)
    {
      arrTexts[i] = lb.options[i].text;
    }
    for(i=0;i<arrTexts.length; i++)
    {
        str = arrTexts[i].split(" -> ");
        newTexts[i] = str[1]+' -> '+str[0];
    }
    newTexts.reverse();
    for(i=0;i<newTexts.length; i++)
    {
        txt = newTexts[i].split(' -> ');
        newArray[i] = txt[1]+' -> '+txt[0];
    }
    for(i=0; i<lb.length; i++)
    {
        lb.options[i].text = newArray[i];
        lb.options[i].value = newArray[i];
    }
}

function sortlist_id() {
var lb = document.getElementById('mylist');
arrTexts = new Array();

for(i=0; i<lb.length; i++)  {
  arrTexts[i] = lb.options[i].text;
}

arrTexts.sort();

for(i=0; i<lb.length; i++)  {
  lb.options[i].text = arrTexts[i];
  lb.options[i].value = arrTexts[i];
}
}

/***********revrse by id******/
function sortreverse_id() {
var lb = document.getElementById('mylist');
arrTexts = new Array();

for(i=0; i<lb.length; i++)  {
  arrTexts[i] = lb.options[i].text;
}

arrTexts.reverse();

for(i=0; i<lb.length; i++)  {
  lb.options[i].text = arrTexts[i];
  lb.options[i].value = arrTexts[i];
}
}
</script>



  ID<a href="javascript:sortlist_id()"> &#x25B2;  </a> <a href="javascript:sortreverse_id()">&#x25BC;</a> |  Name<a href="javascript:sortlist_name()"> &#x25B2;  </a> <a href="javascript:sortreverse_name()">&#x25BC;</a><br/>

<select name=mylist id=mylist size=8 style='width:150px'>

<option value="bill">4 -> Bill</option>
<option value="carl">5 -> Carl</option>
<option value="Anton">1 -> Anton</option>
<option value="mike">2 -> Mike</option>
<option value="peter">3 -> Peter</option>
</select>
<br>
0
Krishna Kamat

Vanilla JS es6 Lokalisierungsoptionen Sortierbeispiel

const optionNodes = Array.from(selectNode.children);
const comparator = new Intl.Collator(lang.slice(0, 2)).compare;

optionNodes.sort((a, b) => comparator(a.textContent, b.textContent));
optionNodes.forEach((option) => selectNode.appendChild(option));

Mein Anwendungsfall war es, ein Dropdown-Menü für die Länderauswahl mit länderspezifischer Sortierung zu lokalisieren. Dies wurde für 250 + Optionen verwendet und war sehr performant ~ 10ms auf meinem Computer.

0
protoEvangelion
function sortItems(c) {
var options = c.options;
Array.prototype.sort.call(options, function (a, b) {
    var aText = a.text.toLowerCase();
    var bText = b.text.toLowerCase();
    if (aText < bText) {
        return -1;
    } else if (aText > bText) {
        return 1;
    } else {
        return 0;
    }
});
}

sortItems(document.getElementById('lstALL'));
0
Joel

Nur eine andere Möglichkeit, dies mit jQuery zu tun:

// sorting;
var selectElm = $("select"),
    selectSorted = selectElm.find("option").toArray().sort(function (a, b) {
        return (a.innerHTML.toLowerCase() > b.innerHTML.toLowerCase()) ? 1 : -1;
    });
selectElm.empty();
$.each(selectSorted, function (key, value) {
    selectElm.append(value);
});
0
jerone