Bernhard: delete from Array

Hallo,

meine Kenntnisse sind offensichtlich schon ein wenig eingestaubt... Wenn ich ein bestimmtes Element aus einem Array löschen will, gab's da eine Methode, das direkt zu referenzieren oder muss ich das mit indexOf() und splice() umschiffen?

Also beispielsweise

let arr = ["foo",  "bar", "baz"];

// PSEUDOCODE
// arr.delete("bar");

Danke, Bernhard

  1. Tach!

    Wenn ich ein bestimmtes Element aus einem Array löschen will, gab's da eine Methode, das direkt zu referenzieren oder muss ich das mit indexOf() und splice() umschiffen?

    Also beispielsweise

    let arr = ["foo",  "bar", "baz"];
    
    // PSEUDOCODE
    // arr.delete("bar");
    

    Suchst du delete? Aber dazu brauchst du auch den Index. Und es hinterlässt eine Lücke an der ehemaligen Stelle des Elements. splice() ist da besser. Ansonsten kannst du das Array auch umkopieren und mit filter() die gewünschten Elemente ermitteln.

    arr = arr.filter(e => e != 'bar');
    

    dedlfix.

    1. FILTER, DAS wars!

      Ich wusste, dass ich da eine Methode hatte, wo ich das Ding beim Namen nannte!

      Vielen Dank beim Auffrischen verstaubter Gefilde meines Gehirns

      1. Hallo Bernhard,

        FILTER, DAS wars!

        Ich wusste, dass ich da eine Methode hatte, wo ich das Ding beim Namen nannte!

        Vielen Dank beim Auffrischen verstaubter Gefilde meines Gehirns

        Hätte nicht gedacht, dass du das mit deiner Ausgangsfrage meintest. Mich würde mal reales Beispiel interessieren (bin halt wissbe(neu)gierig), was genau du mit referenzieren meinstest. Wär das machbar?

        Gruss
        Henry

        --
        Meine Meinung zu DSGVO & Co:
        „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
      2. arr = arr.filter( item => item != 'bar' );
        

        Viel wichtiger als der Streit um die richtigen Namen erscheint mir der Hinweis, dass dieses ALLE items mit dem Wert 'bar' löscht.

        Deine Frage war aber: „Wenn ich ein bestimmtes Element aus einem Array löschen will…“

        Wenn das „ein“ wichtig ist, also z.b. nur das erste Element mit dem Wert gelöscht werden soll, dann ist die gezeigte Lösung nur ein Schritt.

    2. @@dedlfix

      arr = arr.filter(e => e != 'bar');
      

      Nicht dass ich dir jetzt deinen Pluspunkt aberkennen möchte, aber was heißt arr und e?

      Sprechende Variablennamen sind sprechend:

      array = array.filter(element => element != 'bar');
      

      😷 LLAP

      --
      “When I was 5 years old, my mother always told me that happiness was the key to life. When I went to school, they asked me what I wanted to be when I grew up. I wrote down ‘happy.’ They told me I didn’t understand the assignment, and I told them they didn’t understand life.” —John Lennon
      1. Tach!

        arr = arr.filter(e => e != 'bar');
        

        Nicht dass ich dir jetzt deinen Pluspunkt aberkennen möchte, aber was heißt arr und e?

        Sprechende Variablennamen sind sprechend:

        array = array.filter(element => element != 'bar');
        

        array und element sind nicht sprechender als die Abkürzungen. Da kein Kontext bekannt ist, konnte ich keine sinnvollen Namen vergeben.

        dedlfix.

        1. @@dedlfix

          array und element sind nicht sprechender als die Abkürzungen.

          Dafür hast du dir aber jetzt wirklich einen Minuspunkt verdient.

          Heißt e nun event oder error? Oder doch was anderes? Don’t make me think!

          😷 LLAP

          --
          “When I was 5 years old, my mother always told me that happiness was the key to life. When I went to school, they asked me what I wanted to be when I grew up. I wrote down ‘happy.’ They told me I didn’t understand the assignment, and I told them they didn’t understand life.” —John Lennon
          1. Tach!

            array und element sind nicht sprechender als die Abkürzungen.

            Dafür hast du dir aber jetzt wirklich einen Minuspunkt verdient.

            Heißt e nun event oder error? Oder doch was anderes? Don’t make me think!

            Ich wiederhole nochmal: Ich weiß es nicht, weil der Kontext nicht bekannt ist.

            dedlfix.

            1. @@dedlfix

              Ich wiederhole nochmal: Ich weiß es nicht, weil der Kontext nicht bekannt ist.

              Das wird auch durch Wiederholung nicht besser. Natürlich ist der Kontext bekannt: Es handelt sich um Elemente eines Arrays. element spricht das aus.

              Bei noch höherem Bekanntheitsgrad kann man da auch anders benennen. Wenn es sich um die Münzen in Dagobert Ducks Geldspeicher handelt bspw.:

              coins = coins.filter(coin => coin != 'bar');
              

              Aber da sollten keine Münzen wegkommen, sondern nur welche hinzukommen.

              😷 LLAP

              --
              “When I was 5 years old, my mother always told me that happiness was the key to life. When I went to school, they asked me what I wanted to be when I grew up. I wrote down ‘happy.’ They told me I didn’t understand the assignment, and I told them they didn’t understand life.” —John Lennon
              1. Tach!

                Das wird auch durch Wiederholung nicht besser. Natürlich ist der Kontext bekannt: Es handelt sich um Elemente eines Arrays. element spricht das aus.

                'array' und 'element' sind Metanamen, die sind nicht sprechend.

                Bei noch höherem Bekanntheitsgrad

                Das ist Unsinn. Wenn es darum geht, Code für einen Anwendungsfall zu programmieren, ist bekannt worum es sich handelt. Da gibt es nichts abzustufen.

                kann man da auch anders benennen.

                Wenn es sich um die Münzen in Dagobert Ducks Geldspeicher handelt bspw.:

                coins = coins.filter(coin => coin != 'bar');
                

                Ja, coins und coin wären in dem Fall sprechend. Aber was ist 'bar'?

                dedlfix.

                1. @@dedlfix

                  'array' und 'element' sind Metanamen,

                  Ja.

                  die sind nicht sprechend.

                  Quatsch.

                  Ja, coins und coin wären in dem Fall sprechend. Aber was ist 'bar'?

                  Ist doch klar: Bargeld.

                  😷 LLAP

                  --
                  “When I was 5 years old, my mother always told me that happiness was the key to life. When I went to school, they asked me what I wanted to be when I grew up. I wrote down ‘happy.’ They told me I didn’t understand the assignment, and I told them they didn’t understand life.” —John Lennon
                  1. Tach!

                    'array' und 'element' sind Metanamen,

                    Ja.

                    die sind nicht sprechend.

                    Quatsch.

                    coins = coins.filter(element => element != 'bar');
                    

                    Das wäre also für dich sprechend. Für mich ist es das nicht, weil element eine technische Bezeichnung bezogen auf das Array ist, und kein Begriff aus dem Anwendungsfall.

                    Das Problem in diesem Thread ist, dass wir keinen Anwendungsfall haben, sondern nur beispielhafte Metasyntax. Egal wie meine Antwort ausgefallen wäre, man hätte mir aus jeder aus jeder Möglichkeit einen Strick drehen können.

                    arr = arr.filter(element => element != 'bar');
                    

                    "Warum schreibst du Metasyntax? Wenn das jemand so kopiert, hat er Metasyntax in seinem Projekt. Das ist nicht sprechend für den Anwendungsfall. Da muss der Leser nachdenken, wofür arr und element steht. Don't make me think. Denken ist schädlich …"

                    coins = coins.filter(coin => coin != 'bar');
                    

                    "Warum überträgst du das Beispiel des OP auf einen anderen Anwendungsfall? Jetzt hast du zwar sprechende Bezeichner gemäß einem fiktiven Anwendungsfall, aber der OP muss nun umdenken, wie das auf seine Beispielsyntax und am Ende auf seinen Anwendungsfall passt. Don't make me think. Denken ist schädlich …"

                    Ich hätte das Beispiel ganz weglassen sollen. "Oh nein, dann muss der Anweder die Syntax in einem Manual nachschlagen und die dortigen Beispiele auf seinen Anwendungsfall umdenken. Don't make me think. Denken ist schädlich …"

                    dedlfix.

              2. Hallo,

                coins = coins.filter(coin => coin != 'bar');
                

                Möchtest du mich jetzt denkend machen, da nun neben dem Programmieren auch noch aus einer Fremdsprache übersetzt werden muß?

                Scnr

                Gruß
                Kalk

              3. printf('Hallo %s!', ['Du', 'ihr', 'Welt', 'zusammen'][rand(0, 3)]);

                Das wird auch durch Wiederholung nicht besser. Natürlich ist der Kontext bekannt: Es handelt sich um Elemente eines Arrays. element spricht das aus.

                Bei element denke ich bei unbekanntem JS-Code als erstes an ein HTML-Element. Damit hätte ich zwar don't make me think erfüllt, aber ich wäre auf einem völlig falschen Pfad.

                Ich nutze daher bevorzugt item

                /K

      2. Hallo Gunnar,

        bei "arr" kann ich deiner Argumentation folgen, aber bei winzigen Lambdas sehe ich das anders. Deren Sinn ist es, in eine Zeile zu passen, und sie verwenden typischerweise genau eine Variable. In diesem Mikrokosmos gelten einfachere Regeln.

        münzen = münzen.filter(m => m.art == 'Glückszehner');
        

        wäre also für mich durchaus okay. Oder in einem kontextfreien Beispiel mit Metanamen dann

        array = array.filter(e => e != 'bar');
        

        Im kompakten Kontext gibt's da nichts zu denken. Hauptsache, es passt in eine Zeile. Don't make me scroll my code horizontally ist ebenfall eine Maxime, die man beachten sollte, und Only COBOL programmers win the Pulitzer price for their code. 😉

        Didaktik hin, Einsteigerverständlichkeit her, zur Lesbarkeit gehört auch die Lesbarkeit in angemessener Zeit. Wenn das Lambda zur ausgewachsenen Funktion wird, sieht die Sache natürlich sofort anders aus.

        Drölf Edits später: Ich hoffe, jetzt keine Tippfehler mehr zu haben 😟

        Rolf

        --
        sumpsi - posui - obstruxi
        1. @@Rolf B

          bei "arr" kann ich deiner Argumentation folgen

          Ich finde e noch schlimmer als arr.

          (Es gibt aber auch keinen Grund, array zu verstümmeln.)

          aber bei winzigen Lambdas sehe ich das anders. Deren Sinn ist es, in eine Zeile zu passen

          Nein. Code sollte lesbar sein, nicht in eine Zeile gezwängt werden.

          Und zwar lesbar für andere. (Und auch das Zukunft-Ich ist jemand anderes.)

          Wenn

          münzen = münzen.filter(münze => münze.art == 'Glückszehner');
          

          zu lang für eine Zeile sein sollte, dann eben

          münzen = münzen.filter(
              münze => münze.art == 'Glückszehner',
          );
          

          😷 LLAP

          --
          “When I was 5 years old, my mother always told me that happiness was the key to life. When I went to school, they asked me what I wanted to be when I grew up. I wrote down ‘happy.’ They told me I didn’t understand the assignment, and I told them they didn’t understand life.” —John Lennon
          1. Zu Lesbarkeit gehören mehr Facetten als nur die Wortwahl. Aussagekräftige Variablennamen sind leider auch oft deutlich länger als generische Namen. Dadurch erhöht sich die Signal-To-Noise-Rate: Der Fokus wird damit auf einzelne Worte gelenkt, und von der Satzstruktur abgezogen. Umgekehrt erhöhen kurze Bezeichner die Informationsdichte, ob das gut oder schlecht ist, hängt sehr vom Lesenden ab.

            Mit Funktionen höherer Ordnung kann man in vielen Fällen das Problem umgehen, nennt sich point-free style oder Tacit Programming. In JavaScript sähe das bspw. so aus:

            list.remove(equals('foo'))
            

            Ob das besser oder schlechter ist, liegt auch wieder im Auge des Betrachters.