pl: Liste von Eigenschaften zuweisen

Also was ich suche ist der Perl-Hash-Slice in Javascript. Gibt es das überhaupt?

In Perl sieht das so aus:

my %h = ();
my @cols =  qw(name     vname str      plz   ort);
@h{@cols} = qw(Heinrich Ernst Stadtweg 12345 Hamm);

JS? Da wäre %h ein Objekt. Und cols wären die Eigenschaften mit Werten. MFG

  1. Tach!

    Also was ich suche ist der Perl-Hash-Slice in Javascript. Gibt es das überhaupt?

    In Perl sieht das so aus:

    my %h = ();
    my @cols =  qw(name     vname str      plz   ort);
    @h{@cols} = qw(Heinrich Ernst Stadtweg 12345 Hamm);
    

    JS? Da wäre %h ein Objekt. Und cols wären die Eigenschaften mit Werten.

    Beschreib doch mal, was du in Javascript zu erreichen versuchst, ohne dass man Perl-Code lesen können muss, um überhaupt die Frage zu verstehen.

    Möchtest du ein Array mit Keys und ein Array mit Werten so verbinden, dass ein Objekt mit diesen Keys und Werten entsteht? Das kann man hinbekommen, aber eine fertige Funktion dazu existiert meines Wissens nicht. Ich würde eher versuchen, eine andere Herangehensweise an das eigentliche Problem zu suchen, als mit solchen Datenstrukturen hantieren zu müssen.

    Aber ansonsten geht das schon mit Zwischenschritt, der ein Array mit Arrays aus Key und zugehörigem Value erzeugt.

    const keys = ['a', 'b', 'c'];
    const values = [1, 2, 3];
    
    const key_values = keys.map(function(key, index) {
      return [key, values[index]];
    });
    

    Das Objekt gibts dann mit Object​.from​Entries(key_values) in modernen Browsern.

    dedlfix.

  2. Es geht praktisch darum diese Zeilen

     for(var i = 0; i < cols.length; i++){
       wk[cols[i]] = values[i];
     }
    

    durch eine Zeile zu ersetzen. Hier ist die Anwendung

    MFG

    1. Tach!

      Es geht praktisch darum diese Zeilen

       for(var i = 0; i < cols.length; i++){
         wk[cols[i]] = values[i];
       }
      

      durch eine Zeile zu ersetzen.

      Nimm die Zeilenumbrüche raus.

      Ansonsten könnte man noch von iterativ auf funktional umstellen, aber das spart auch keine Zeilen.

      dedlfix.

      1.  for(var i = 0; i < cols.length; i++){
           wk[cols[i]] = values[i];
         }
        

        durch eine Zeile zu ersetzen.

        Nimm die Zeilenumbrüche raus.

        Die geschweiften Klammern können auch weg:

        for( var i = 0; i < cols.length; i++ ) wk[cols[i]] = values[i];
        
        1. Hallo ursus,

          ich denke auch, dass es da keinen direkteren Weg gibt. Man muss nicht alles in die Sprache einbauen, eine Funktion reicht oft auch.

          Ich hätte noch eine Variante mit foreach oder reduce anzubieten:

          const cols = [ 'a', 'b', 'c'];
          const values = [ 1, 2, 3];
          
          let obj = buildObject(cols, values);
          
          console.log(obj);
          // {a: 1, b: 2, c: 3}
          
          function buildObject(cols, values, proto) {
             let o = Object.create(proto || new Object());
          // so
             return cols.reduce((a,c,i) => (a[c] = values[i], a), o);
          // oder so
             return cols.foreach((c,i) => o[c] = values[i], o);
          }
          

          Da kann man dann auch auf Wunsch gleich einen Prototypen angeben (ähnlich wie bless in Perl)

          foreach ist besser lesbar als reduce, finde ich.

          Rolf

          --
          sumpsi - posui - clusi
          1. Tach!

            Meine erste Lösung war zwar auch eienn Schritt zu umständlich (das Zwischen-Array), aber hier kann man auch noch mal den Rotstift ansetzen.

               let o = Object.create(proto || new Object());
            

            Statt let geht auch const. Der Variable o wird in ihrem Geltungsbereich kein weiterer Wert zugewiesen. Dass dem Objekt die Eigenschaften geändert werden, ist für const nicht von Belang.

            Object.create(proto || new Object()) kann man zu proto || {} verkürzen. Der Unterschied ist, wenn jemand kein Objekt für proto übergibt, gibts bei dir eine Exception, bei der kurzen Variante hingegen "Garbage In, Garbage Out". Zumindest das new Object() geht als {} zu vereinfachen.

               return cols.foreach((c,i) => o[c] = values[i], o);
            

            Das geht so nicht, man muss schon das o zurückgeben und nicht das undefined vom forEach(), was man auch noch mit großem E schreiben muss.

            dedlfix.

    2. Aloha ;)

      Es geht praktisch darum diese Zeilen

       for(var i = 0; i < cols.length; i++){
         wk[cols[i]] = values[i];
       }
      

      durch eine Zeile zu ersetzen.

      Nichts einfacher als das:

       for(var i = 0; i < cols.length; i++){ wk[cols[i]] = values[i]; }
      

      Grüße,

      RIDER

      --
      Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
      # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
      1. Aloha ;)

        Nichts einfacher als das:

        Oh, Schade, @dedlfix war schneller. Hatte die Seite noch nicht neu geladen.

        Grüße,

        RIDER

        --
        Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
        # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
    3. Es geht praktisch darum diese Zeilen

       for(var i = 0; i < cols.length; i++){
         wk[cols[i]] = values[i];
       }
      

      durch eine Zeile zu ersetzen. Hier ist die Anwendung

      Da du nur eine fixe Anzahl an Spalten hast, könnte man das auch im Code statisch notieren:

      const landkreis = {
        WKR_NR: values[0],
        WKR_NAME: values[1],
        LAND_NR: values[2],
        LAND_NAME: values[3],
        LAND_ABK: values[4]
      }
      

      Ist nicht zwar nicht kürzer, hat aber auch Vorteile.