jsnewbie: Frage zu array push

Hallo

möchte unter Js an ein Array weitere Keys anhängen.

  
  
das Ursprungsarray sieht so aus  
  
var ary = {  
		t1:"",  
		t2:"",  
		t3:"",  
		t4:""  
	}  
  
an das Array "ary" was mittlerweile mit values gefüllt wurde  möchte ich nun weitere keys anhängen  
                 var obj = {};  
		obj['t5'] : "";  
		obj['t6'] : "";  
		obj['t7'] : "";  
		obj['t8'] : "";  
  
		ary.push(obj);  

das klappt leider nicht.
weiss jemand warum?

Ein frohes Fest wünscht
Martin

  1. Hallo,
    Das hier:

    var ary = {
    t1:"",
    t2:"",
    t3:"",
    t4:""
    }

    ist kein Array, sondern ein Objekt.
    Jedes Array ist in JS zwar ein Objekt,aber nicht jedes Objekt ist auch ein Array.

    Hingegen wäre das hier:

      
    var ary = ["","","",""];  
    
    

    ein Array, bei dem auch push funktioniert.

    Viele Grüsse,
    Jörg

  2. Aloha ;)

    var ary = {

      t1:"",  
      t2:"",  
      t3:"",  
      t4:""  
    

    }
                     var obj = {};
    obj['t5'] : "";
    obj['t6'] : "";
    obj['t7'] : "";
    obj['t8'] : "";

      ary.push(obj);  
    
      
    (Kleine Anmerkung zwischendurch: Syntax wie `obj['t5'] : "";`{:.language-javascript} ist natürlich falsch, das muss wenn, dann `obj['t5'] = "";`{:.language-javascript} heißen... Die Notation mit Doppelpunkt kommt nur innerhalb expliziter Objektdefinitionen vor...)  
      
    In Ergänzung zu mrjerks vollkommen richtigem Einwand: Arrays sind in JavaScript nie mit sprechenden, sondern nur mit numerischen Bezeichnern möglich. Wenn du eine Funktionalität ähnlich wie push für generische Objekte brauchst, musst du's dir in etwa so selber bauen:  
      
    ~~~javascript
    function push_obj(obj,add) {  
        for (var x in add) {  
            obj[x] = add[x];  
        }  
    }
    

    Wenn du mehrere solcher Objekte brauchst und/oder noch mehr Array-Eigenschaften nachbilden musst/willst, kannst du auch überlegen, das formschön an einen Konstruktor zu delegieren.

    function ArrayObj (initobj) {  
        this.push = function (add) {  
            for (var x in add) {  
                // Wir wollen ja nicht, dass unsere Funktion in der  
                // Lage ist, sich selbst zu überschreiben  
                if (typeof this[x] != 'function') {  
                    this[x] = add[x];  
                } else {  
                    console.log('Error: ArrayObj.push tried to overwrite member-function ArrayObj.'+x+' with value '+add[x]+'.');  
                }  
            }  
        };  
      
        this.push(initobj);  
    }  
      
    ary = new ArrayObj({t1:"",t2:"",t3:"",t4:""});  
      
    var obj = {};  
    obj['t5'] = "";  
    obj['t6'] = "";  
    obj['t7'] = "";  
    obj['t8'] = "";  
      
    ary.push(obj);
    

    Code ist ausnahmsweise sogar getestet ;) Vorteil dieser Methode: Die Benutzung durch Member-Funktionen ist intuitiver und stärker an den Sprachstandard angelehnt als das Benutzen einer globalen Funktion. Nachteil: Manche Bezeichner (nämlich die, die schon von Memberfunktionen genutzt werden) sind nicht belegbar.

    Grüße,

    RIDER

    --
    Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
    ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
  3. Hi,

    wie gesagt hast du es mit Objects und nicht mit Arrays zu tun.

    ary.push(obj);

    So etwas ist mit Helferfunktionen möglich. Ein Ansatz wurde schon gepostet. Bibliotheken wie Underscore oder Lodash bieten verschiedene Funktionen zum Arbeiten mit Objekten.

    http://underscorejs.org/#extend
    https://lodash.com/docs#assign

    Harry