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.
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.
var ar = [1,2,3,4,5];
ar.move(0,3);
alert(ar) // 2,3,4,1,5
Diagramm:
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:
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
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
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
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().
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
Michael Schnaps
Unveränderliche Version, keine Nebenwirkungen (verändert das ursprüngliche Array 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