2016-08-29 7 views
1

Das Objekt mRegion fügt das letzte Objekt mehrmals hinzu, jedoch druckt objBeacon verschiedene Objekte. Was ist los mit der Region?Hinzufügen von Objekten in JavaScript-Arrays zur Laufzeit

 var mRegion = new Array(); 

     var objBeacon = { 
      id: '10', 
name:'name', 
      description: 'description' 
     }; 
     $.ajax(settings).done(function(response) { 
        // populate beacon registry in an array 
        for (var i in response.items[0].devices) { 
         objBeacon.id = response.items[0].devices[i].id; 
         objBeacon.name = response.items[0].devices[i].name; 
         objBeacon.description = response.items[0].devices[i].description; 


         console.log("value of i is" + i); 
         console.log(objBeacon); 

         mRegion.push(objBeacon); 
        } 
        console.log(mRegion); 
+1

Was ist der Fehler? – Aravind

+0

Es gibt keinen Fehler, aber das gleiche Objekt wird im Array hinzugefügt – RDX

Antwort

2

Objekte in JavaScript sind als Referenz übergeben. Sie haben nur eine Variable objBeacon und jedes Array-Element zeigt auf diese Variable. Wenn Sie objBeacon ändern, ändern sich alle Referenzen.

var mRegion = []; 

$.ajax(settings).done(function(response) { 
    // populate beacon registry in an array 
    for (var i in response.items[0].devices) { 
    mRegion.push({ 
     id: response.items[0].devices[i].id, 
     uid: '00', 
     major: 1, 
     minor: 1, 
     name: response.items[0].devices[i].name, 
     description: response.items[0].devices[i].description 
    }); 
    } 
}); 
+0

wird es einen Unterschied machen, wenn wir var mRegion = new Array() verwenden; anstelle von var mRegion = []; – RDX

+1

Nein, aber der Array-Konstruktor hat einige Macken mit der Handhabung von Eingabeparametern. Aus diesem Grund wird empfohlen, beim Erstellen neuer Arrays immer das Array-Literal '[]' zu verwenden. –

0

Sie erstellen immer nur ein Objekt und weisen ihm einen Verweis zu objBeacon zu.

Jedes Mal, wenn Sie die Schleife durchlaufen, ändern Sie das einzelne Objekt, das Sie haben, und schieben einen zusätzlichen Verweis darauf in das Array.

Wenn Sie ein Array mit verschiedenen Objekten wünschen, müssen Sie jedes Mal, wenn Sie die Schleife durchlaufen, ein neues Objekt erstellen.

0

Da Sie Objekte verwenden, verwenden Sie "Referenzen" anstelle von "Klone".

Dieser Code funktionieren sollte (auch ist es nicht sehr schönen)

var mRegion = new Array(); 


$.ajax(settings).done(function(response) { 
    // populate beacon registry in an array 
    for (var i in response.items[0].devices) { 
     var objBeacon = { 
      id: '10', 
      uid: '00', 
      major: 1, 
      minor: 1, 
      name: 'name', 
      description: 'description' 
     }; 

     objBeacon.id = response.items[0].devices[i].id; 
     objBeacon.name = response.items[0].devices[i].name; 
     objBeacon.description = response.items[0].devices[i].description; 


     console.log("value of i is" + i); 
     console.log(objBeacon); 

     mRegion.push(objBeacon); 
    } 
    console.log(mRegion); 
}); 
Verwandte Themen