Speziellen Wert aus Array behandeln - tatsächlich so kompliziert?
Georg
- javascript
Hallo Leute!
Zugegeben.
Die Fragestellung lässt sich mit einer Google-Suche im Millisekundenbereich abhandeln.
Ich bin nur perplex, dass es tatsächlich so umständlich zu geschehen hat
und zwar einen Wert aus einem Array in eine Variable zu verschieben, nach dem Schema let VariableAusArr = myArr.shift();
Muss ich für let myArr = ["eins", "zwei", "drei"]
tatsächlich splice()
oder filter()
bemühen, wenn ich weiß dass ich z.B. einfach "zwei"
entfernen und in einer Variable speichern will?
Schmeckt nach Overengineering at its finest.
LG, Georg
Lieber Georg,
und zwar einen Wert aus einem Array in eine Variable zu verschieben, nach dem Schema
let VariableAusArr = myArr.shift();
Du tust hier mehr, als nur eine Variable "kopieren", denn Du veränderst ja auch noch das Array, in dem sie bisher stand.
Muss ich für
let myArr = ["eins", "zwei", "drei"]
tatsächlichsplice()
oderfilter()
bemühen, wenn ich weiß dass ich z.B. einfach"zwei"
entfernen und in einer Variable speichern will?
Ja.
Schmeckt nach Overengineering at its finest.
Warum musst Du den Wert denn aus dem Array ausschneiden? Warum genügt es nicht, ihn nur zu lesen?
Liebe Grüße
Felix Riesterer
Hallo Georg,
Muss ich für let myArr = ["eins", "zwei", "drei"] tatsächlich splice() oder filter() bemühen
Overengineering at its finest.
filter wäre sicherlich Overengineering. Splice dagegen nicht. Wenn das Ergebnis nachher sein soll, dass Du ein Array mit 2 Elementen hast, mit "eins" auf Index 0 und "drei" auf Index 1, dann brauchst Du splice.
const pos2 = myArr.indexOf("zwei");
myArr.splice(pos2, 1); // gibt ["zwei"] zurück
console.log(myArr);
// (2) ["eins", "drei"]
// 0: "eins"
// 1: "drei"
// length: 2
Die splice Funktion verändert das ursprüngliche Array. Sie ersetzt einen Bereich von Elementen und passt die Länge an. Das ist eine relativ aufwändige Operation, ja. In anderen Sprachen gibt es eine Funktionen wie REMOVE oder REMOVEAT, um einen Wert an Index I aus einem Array zu entfernen. Unter der Haube machen sie genau das Gleiche wie splice(i,1).
Wenn du den String "zwei" einfach nur aus dem Array heraushaben willst, geht es auch so:
const pos2 = myArr.indexOf("zwei");
delete myArr[pos2]; // gibt true zurück
console.log(myArr);
// (3) ["eins", empty, "drei"]
// 0: "eins"
// 2: "drei"
// length: 3
Du erzeugst eine Lücke in den Indexen, der Wert von length stimmt nicht mehr mit der Anzahl der Elemente überein, aber indexOf("zwei") wird nichts mehr finden. Statt delete myArr[1] kannst Du auch null oder undefined an myArr[1] zuweisen.
Ob das tatsächlich schneller ist, müsste man erstmal messen. Es ist auf jeden Fall nicht einfacher, wenn man nachher ein Array mit einer Lücke im Index hat, oder einem null-Wert mittendrin. Sowas kann an anderen Stellen zu mühsamen Sonderbehandlungen führen, und das wäre dann Under-Engineering.
Aber es gibt sicher auch Fälle, wo sowas sinnvoll ist. Ich würde dann aber einen Schritt zurück machen und fragen: Ist das Array vielleicht ein Engineering Error?
Wo kommt ["eins", "zwei", "drei"] her? Ist es die richtige Datenstruktur? Wäre vielleicht ein Set-Objekt angemessener (im Internet Explorer ab Version 11)? Oder einfach ein POJO (plain old javascript object) { eins: true, zwei: true, drei: true }?
Ist nur so eine Überlegung. Ich kenne deine Anwendung nicht.
Rolf