Javascript-Array-Sortierung und eindeutig

Lesezeit: 4 Minuten

Benutzeravatar von theHack
derHack

Ich habe ein JavaScript-Array wie folgt:

var myData=['237','124','255','124','366','255'];

Ich brauche die Array-Elemente eindeutig und sortiert sein:

myData[0]='124';
myData[1]='237';
myData[2]='255';
myData[3]='366';

Obwohl die Mitglieder des Arrays sehen aus wie ganze ZahlenSie sind keine ganzen Zahlenda ich bereits jeden in einen String umgewandelt habe:

var myData[0]=num.toString();
//...and so on.

Gibt es eine Möglichkeit, all diese Aufgaben in JavaScript zu erledigen?

Benutzeravatar von lonesomeday
eines Tages

Das ist eigentlich ganz einfach. Es ist viel einfacher eindeutige Werte zu finden, wenn die Werte zuerst sortiert werden:

function sort_unique(arr) {
  if (arr.length === 0) return arr;
  arr = arr.sort(function (a, b) { return a*1 - b*1; });
  var ret = [arr[0]];
  for (var i = 1; i < arr.length; i++) { //Start loop at 1: arr[0] can never be a duplicate
    if (arr[i-1] !== arr[i]) {
      ret.push(arr[i]);
    }
  }
  return ret;
}
console.log(sort_unique(['237','124','255','124','366','255']));
//["124", "237", "255", "366"]

  • Was ist der Sinn zu tun a*1 - b*1 statt nur a - b?

    – NullUserException

    13. Januar 2013 um 20:58 Uhr


  • Nach 9 fehlgeschlagenen Versuchen hat mich StackSort von Randall Munroe hierher geschickt, großartiges Beispiel: P gkoberger.github.io/stacksort

    – Fi Horan

    5. Januar 2017 um 14:59 Uhr

  • @FiHoran Es scheint jedes Mal hierher zu kommen!

    – Hartnäckig

    21. Mai 2017 um 14:50 Uhr

  • Hat 15 Versuche gedauert, aber StackSort hat mich hierher gebracht.

    – Michael Morris

    14. November 2017 um 7:18 Uhr

  • Ein 7 Jahre alter PR wurde gerade zusammengelegt die Stacksort-Site Dank eines Threads auf Reddit. Hier kommen die Upvotes – es wird wieder knisternd heiß. github.com/gkoberger/stacksort/pull/4

    – Jamie

    19. Januar 2021 um 7:52 Uhr


Sie können das Ergebnis jetzt in nur erreichen eines Codezeile.

Verwenden neuer Satz um das Array auf einen eindeutigen Satz von Werten zu reduzieren. Wende an Sortieren Methode nach, um die Zeichenfolgenwerte zu ordnen.

var myData=['237','124','255','124','366','255']

var uniqueAndSorted = [...new Set(myData)].sort() 

AKTUALISIERT für neuere Methoden, die seit dem Zeitpunkt der Frage in JavaScript eingeführt wurden.

Benutzeravatar von mrmonkington
Herrmonkington

Dies kann in Fällen angemessen sein, in denen Sie die Funktion nicht im Voraus definieren können (wie in einem Bookmarklet):

myData.sort().filter(function(el,i,a){return i===a.indexOf(el)})

  • myData.sort().filter(function(el,i,a){return i==a.indexOf(el);})

    – Ischtar

    21. Januar 2013 um 10:55 Uhr

  • myData.sort().filter(function(el,i,a){return !i||el!=a[i-1];})

    – Dave Causey

    23. Juli 2015 um 3:56 Uhr

  • Groß-/Kleinschreibung beachten: myData.sort().filter(function(el,i,a){return !i||el.toLowerCase()!=a[i-1].toLowerCase();})

    – dfmiller

    5. Februar 2016 um 20:36 Uhr


  • myData.sort().filter((x,i,a)=>x!=a[i-1]) (Dies entfernt den ersten Nullwert, funktioniert aber ansonsten hervorragend)

    – Phaux

    8. Dezember 2016 um 14:47 Uhr

  • ES6-Syntax: arr.sort().filter((el,i,a) => (i===a.indexOf(el)));

    – Holdsworth

    22. Juni 2017 um 10:13 Uhr


Benutzeravatar von phaux
Phaux

Hier ist mein (modernerer) Ansatz mit Array.protoype.reduce():

[2, 1, 2, 3].reduce((a, x) => a.includes(x) ? a : [...a, x], []).sort()
// returns [1, 2, 3]

Bearbeiten: Performantere Version, wie in den Kommentaren erwähnt:

arr.sort().filter((x, i, a) => !i || x != a[i-1])

Benutzeravatar von ioleo
ioleo

function sort_unique(arr) {
    return arr.sort().filter(function(el,i,a) {
        return (i==a.indexOf(el));
    });
}

  • filter ist auch nicht jQuery. Das wäre $.filter.

    – Ry-

    25. Februar 2014 um 19:17 Uhr

Benutzeravatar von glampr
glampr

Wie wäre es mit:

array.sort().filter(function(elem, index, arr) {
  return index == arr.length - 1 || arr[index + 1] != elem
})

Dies ähnelt der @loostro-Antwort, aber anstatt indexOf zu verwenden, das das Array für jedes Element wiederholt, um zu überprüfen, ob es das erste gefundene Element ist, prüft es nur, ob das nächste Element anders ist als das aktuelle.

  • filter ist auch nicht jQuery. Das wäre $.filter.

    – Ry-

    25. Februar 2014 um 19:17 Uhr

Benutzeravatar der Community
Gemeinschaft

Versuchen Sie es mit einer externen Bibliothek wie z unterstreichen

var f = _.compose(_.uniq, function(array) {
    return _.sortBy(array, _.identity);
});

var sortedUnique = f(array);

Dies beruht auf _.compose, _.uniq, _.sortBy, _.identity

Live sehen Beispiel

Was macht es?

Wir wollen eine Funktion, die ein Array akzeptiert und dann ein sortiertes Array zurückgibt, bei dem die nicht eindeutigen Einträge entfernt sind. Diese Funktion muss zwei Dinge tun, das Array sortieren und eindeutig machen.

Dies ist eine gute Arbeit für die Komposition, also komponieren wir die Unique & Sort-Funktion zusammen. _.uniq kann nur mit einem Argument auf das Array angewendet werden, sodass es nur übergeben wird _.compose

Die Funktion _.sortBy benötigt eine bedingte Sortierfunktion. Es erwartet eine Funktion, die einen Wert zurückgibt, und das Array wird nach diesem Wert sortiert. Da der Wert, nach dem wir es ordnen, der Wert im Array ist, können wir einfach die Funktion _.identity übergeben.

Wir haben jetzt eine Zusammensetzung aus einer Funktion, die (ein Array nimmt und ein eindeutiges Array zurückgibt) und einer Funktion, die (ein Array nimmt und ein sortiertes Array zurückgibt, sortiert nach ihren Werten).

Wir wenden einfach die Zusammensetzung auf das Array an und wir haben unser eindeutig sortiertes Array.

1404470cookie-checkJavascript-Array-Sortierung und eindeutig

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy