Rolf B: Speziellen Wert aus Array behandeln - tatsächlich so kompliziert?

Beitrag lesen

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

--
sumpsi - posui - obstruxi