Arrays neu anordnen

Lesezeit: 4 Minuten

Arrays neu anordnen
Wurlitzer

Sagen wir, ich habe ein Array, das so aussieht:

var playlist = [
    {artist:"Herbie Hancock", title:"Thrust"},
    {artist:"Lalo Schifrin", title:"Shifting Gears"},
    {artist:"Faze-O", title:"Riding High"}
];

Wie kann ich ein Element an eine andere Position verschieben?

Ich möchte zum Beispiel umziehen, {artist:"Lalo Schifrin", title:"Shifting Gears"} bis zum Ende.

Ich habe es mit Spleiß versucht, wie folgt:

var tmp = playlist.splice(2,1);
playlist.splice(2,0,tmp);

Aber es funktioniert nicht.

  • Was bedeutet “funktioniert nicht” – wirft es einen Fehler aus, ändert es nichts, ändert es Ihr Array auf eine Weise, die Sie nicht beabsichtigt haben? Für mich sieht es vernünftig aus.

    – Jacob Mattison

    14. März ’10 bei 0:41

Arrays neu anordnen
Matt

Die Syntax von Array.splice ist:

yourArray.splice(index, howmany, element1, /*.....,*/ elementX);

Wo:

  • Index ist die Position im Array, an der Sie Elemente entfernen möchten
  • wie viele ist, wie viele Elemente Sie entfernen möchten Index
  • element1, …, elementX sind Elemente, die Sie von Position einfügen möchten Index.

Das bedeutet, dass splice() kann verwendet werden, um Elemente zu entfernen, Elemente hinzuzufügen oder Elemente in einem Array zu ersetzen, abhängig von den übergebenen Argumenten.

Beachten Sie, dass es ein Array der entfernten Elemente zurückgibt.

Etwas Schönes und Allgemeines wäre:

Array.prototype.move = function (from, to) {
  this.splice(to, 0, this.splice(from, 1)[0]);
};

Dann nutze einfach:

var ar = [1,2,3,4,5];
ar.move(0,3);
alert(ar) // 2,3,4,1,5

Diagramm:

Algorithmusdiagramm

  • Dies ist eine gute Antwort, und splice() innerhalb von splice() macht die Arbeit gut. Es sollte jedoch beachtet werden, dass das Hinzufügen einer move()-Methode zum Array-Prototyp “Monkey Patching” genannt wird und normalerweise als schlechte Praxis angesehen wird. stackoverflow.com/questions/5741877/…

    – Aaron Cicali

    16. Juli ’15 um 0:29


  • Scheint mit splice() schwierig zu sein, es gibt einige Randfälle, die schwer zu lösen sind – das heißt, wenn mehr als zwei Elemente gleichzeitig neu angeordnet werden.

    – Petar Vasilev

    1. November ’21 um 19:04

Wenn Sie die Indizes kennen, können Sie die Elemente leicht mit einer einfachen Funktion wie dieser austauschen:

function swapElement(array, indexA, indexB) {
  var tmp = array[indexA];
  array[indexA] = array[indexB];
  array[indexB] = tmp;
}

swapElement(playlist, 1, 2);
// [{"artist":"Herbie Hancock","title":"Thrust"},
//  {"artist":"Faze-O","title":"Riding High"},
//  {"artist":"Lalo Schifrin","title":"Shifting Gears"}]

Array-Indizes sind nur Eigenschaften des Array-Objekts, sodass Sie seine Werte austauschen können.

  • Danke @CMS. Wenn ich meine Mittel tausche, möchte ich die Reihenfolge nicht ersetzen … Zum Beispiel, wenn ich das 3. Objekt an der 1. Position auswähle, möchte ich 1 als 2 und 2 als 3 als 1 tauschen

    – Peri

    2. August ’18 um 6:41

Hier ist eine unveränderliche Version für diejenigen, die es interessiert:

function immutableMove(arr, from, to) {
  return arr.reduce((prev, current, idx, self) => {
    if (from === to) {
      prev.push(current);
    }
    if (idx === from) {
      return prev;
    }
    if (from < to) {
      prev.push(current);
    }
    if (idx === to) {
      prev.push(self[from]);
    }
    if (from > to) {
      prev.push(current);
    }
    return prev;
  }, []);
}

  • Hallo, könnten Sie mir die Vorteile dieser Funktion gegenüber der obigen Antwort erklären?

    – Xogno

    27. Apr. ’17 um 12:28

  • Diese Lösung ändert nicht das ursprüngliche Element, sondern gibt ein neues Array mit dem verschobenen Eintrag zurück.

    – chmanie

    4. August ’17 um 18:49

  • @Xogno Es ist besonders nützlich in Frameworks wie React, die oft unveränderliche Objekte erfordern, um Änderungen zu erkennen

    – Erdal G.

    29. Januar ’21 um 23:24

  • Danke euch beiden für die Erklärungen

    – Xogno

    3. Feb. ’21 um 17:20


1641737194 714 Arrays neu anordnen
Andy E

Sie können immer die Sortiermethode verwenden, wenn Sie nicht wissen, wo sich der Datensatz gerade befindet:

playlist.sort(function (a, b) {
    return a.artist == "Lalo Schifrin" 
               ? 1    // Move it down the list
               : 0;   // Keep it the same
});

  • Dadurch werden die Positionen der beiden Elemente vertauscht. Frage ist zur Nachbestellung.

    – DURCH

    23. Dez. 19 um 0:08

1641737194 784 Arrays neu anordnen
Trevor

Ändern Sie 2 in 1 als ersten Parameter im Spleißaufruf beim Entfernen des Elements:

var tmp = playlist.splice(1, 1);
playlist.splice(2, 0, tmp[0]);

  • es sollte playlist.splice(2,0,tmp[0]); Richtig?

    – Crisboot

    26. März ’17 um 1:27

1641737194 317 Arrays neu anordnen
Gemeinschaft

BEARBEITEN: Bitte sehen Sie sich Andys Antwort an, da seine Antwort zuerst kam und dies nur eine Erweiterung von ihm ist

Ich weiß, das ist eine alte Frage, aber ich denke, es lohnt sich, sie aufzunehmen Array.prototype.sort().

Hier ist ein Beispiel von MDN zusammen mit dem link

var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);

// [1, 2, 3, 4, 5]

Zum Glück funktioniert es nicht nur mit Zahlen:

arr.sort([compareFunction])

compareFunction

Gibt eine Funktion an, die die Sortierreihenfolge definiert. Wenn es weggelassen wird, wird das Array nach dem Unicode-Codepunktwert jedes Zeichens sortiert, entsprechend der Zeichenfolgenkonvertierung jedes Elements.

Mir ist aufgefallen, dass Sie sie nach dem Vornamen bestellen:

let playlist = [
    {artist:"Herbie Hancock", title:"Thrust"},
    {artist:"Lalo Schifrin", title:"Shifting Gears"},
    {artist:"Faze-O", title:"Riding High"}
];

// sort by name
playlist.sort((a, b) => {
  if(a.artist < b.artist) { return -1; }
  if(a.artist > b.artist) { return  1; }

  // else names must be equal
  return 0;
});

Beachten Sie, dass Sie, wenn Sie sie nach Nachnamen bestellen möchten, entweder einen Schlüssel für beide haben müssen first_name & last_name oder mach ein bisschen Regex-Magie, was ich nicht kann XD

Hoffentlich hilft das 🙂

  • es sollte playlist.splice(2,0,tmp[0]); Richtig?

    – Crisboot

    26. März ’17 um 1:27

1641737194 865 Arrays neu anordnen
Michael Schnaps

Unveränderliche Version, keine Nebenwirkungen (verändert das ursprüngliche Array nicht):

const testArr = [1, 2, 3, 4, 5];

function move(from, to, arr) {
    const newArr = [...arr];

    const item = newArr.splice(from, 1)[0];
    newArr.splice(to, 0, item);

    return newArr;
}

console.log(move(3, 1, testArr));

// [1, 4, 2, 3, 5]

Codepen: https://codepen.io/mliq/pen/KKNyJZr

.

216170cookie-checkArrays neu anordnen

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

Privacy policy