2016-11-30 3 views
1

Gibt es eine Möglichkeit, Array-Elemente explizit als Verweis statt durch Wert festlegen?Javascript zuweisen Array-Elemente durch Referenz oder durch Wert

Beispielsweise kann diese Methode setzt die Array-Elemente durch Wert:

METHOD 1

var pushes = [2,1] 
for(var i=0; i<pushes.length; i++) 
{ 
    vm.allEmployeesOnJob[i] = vm.allEmployees[pushes[i]];     
} 

und dieses Verfahren enthält die Arrayelemente durch Referenz:

METHODE 2

var pushes = [2,1] 
vm.allEmployeesOnJob = [ 
       vm.allEmployees[2], 
       vm.allEmployees[1]     
       ]; 

Mein Anwendungsfall:

I Winkel-Bootstrap-duallistbox und um die beiden Listboxen bin mit richtig initialisiert werden, der „ng-Modell“ Array muss die „ng-Optionen“ Array-Elemente durch Bezugnahme verweisen. Dies ist auf das Verhalten des DOM-Elements "select" aus den von mir gelesenen Erklärungen zurückzuführen. Der Grund, warum ich weiß, dass die zweite Einstellung durch Referenz erfolgt, liegt daran, dass das Listenfeld ordnungsgemäß mit dieser Methode aktualisiert wird und nicht ordnungsgemäß mit der ersten Methode aktualisiert wird.

Was könnte der Unterschied sein?

Und gibt es eine Möglichkeit, Array-Elemente programmatisch zu den Elementen eines anderen Arrays durch Verweis explizit festzulegen?

EDIT:

vm.allEmployees ist ein Array von Mitarbeitern Objekten.

Inhalt des vm.allEmployees:

[  { 
     "employeeId":1, 
     "firstName":"Bill", 
     "lastName":"Test", 
     "email":null, 
     "phoneNumber":null, 
     "street":"1234 Sesame", 
     "city":"New York City", 
     "state":"New York", 
     "zip":"34555", 
     "activeFlag":true, 
     "homeLocationId":2, 
     "homeLocation":{ 
     "locationId":2, 
     "customerId":2, 
     }, 
     "displayName":"Bill Test - Newaygo" },  
{ 
     "employeeId":2, 
     "firstName":"Bob", 
     "lastName":"Test", 
     "email":null, 
     "phoneNumber":null, 
     "street":"1234 Sesame", 
     "city":"New York City", 
     "state":"New York", 
     "zip":"34555", 
     "activeFlag":true, 
     "homeLocationId":2, 
     "homeLocation":{ 
     "locationId":2, 
     "customerId":2, 
     }, 
     "displayName":"Bob Test - Newaygo" },  
{ 
     "employeeId":4, 
     "firstName":"John", 
     "lastName":"Doe", 
     "email":"[email protected]", 
     "street":"1234 Sesame St", 
     "city":"New York City", 
     "state":"New York", 
     "zip":"34555", 
     "activeFlag":true, 
     "homeLocationId":2, 
     "homeLocation":{ 
     "locationId":2, 
     "customerId":2, 
     }, 
     "displayName":"John Doe - Newaygo" },  
{ 
     "employeeId":5, 
     "firstName":"Bill", 
     "lastName":"Peterson", 
     "email":"[email protected]", 
     "street":"1234 test", 
     "city":"test city", 
     "state":"Maine", 
     "zip":"298379283", 
     "activeFlag":false, 
     "homeLocationId":2, 
     "homeLocation":{ 
     "locationId":2, 
     "customerId":2, 
     }, 
     "displayName":"Bill Peterson - Newaygo" },  
{ 
     "employeeId":6, 
     "firstName":"Jim", 
     "lastName":"Super", 
     "email":"[email protected]", 
     "phoneNumber":"459-456-4455", 
     "street":"1234 Sesame St", 
     "city":"New York City", 
     "state":"New York", 
     "zip":"34555", 
     "activeFlag":true, 
     "homeLocationId":2, 
     "homeLocation":{ 
     "locationId":2, 
     "customerId":2, 
     }, 
     "displayName":"Jim Super - Newaygo" } ] 
+1

Das hat wenig mit dem zu tun JavaScript selbst, aber mehr damit, wie AngularJS '' ng-Modell 'seinen Wert beobachtet. Ich schlage vor, Ihre Frage und Ihren Titel so zu bearbeiten, dass Ihre Verwendung von AngularJS deutlicher wird. Sie können auch zeigen, wie Sie Ihr 'ng-Modell' und' ng-Optionen' für beide Selektionen binden. –

+0

Guter Punkt über den eckigen Teil @MikeMcCaughan. Der Javascript-Teil der Frage war jedoch die große Sorge für meine Frage.Scotts Antwort unten beantwortete diese Frage, daher denke ich, dass ich den Eckigen Teil dieser Frage für einen anderen Beitrag verlassen könnte, wenn ich das nicht funktioniere. –

Antwort

2

In JavaScript-Objekte werden durch Bezugnahme und alle anderen Werte verwiesen (unabhängig davon, ob sie in einem Array sind oder nicht) sind je nach Wert verwiesen wird. Sie können Ihre Werte in einem Objekt speichern und diese übergeben/übergeben, wenn Sie dieses Verhalten benötigen.

Beide unten beschriebenen Methoden arbeiten mit Objekten und haben Referenzen. Diese beiden Schnipsel überprüfen:

METHODE 1

var vm = {}; 
 

 
// Here, the contents of the array are ojbects (by reference) 
 
vm.allEmployees = [  { 
 
     "employeeId":1, 
 
     "firstName":"Bill", 
 
     "lastName":"Test", 
 
     "email":null, 
 
     "phoneNumber":null, 
 
     "street":"1234 Sesame", 
 
     "city":"New York City", 
 
     "state":"New York", 
 
     "zip":"34555", 
 
     "activeFlag":true, 
 
     "homeLocationId":2, 
 
     "homeLocation":{ 
 
     "locationId":2, 
 
     "customerId":2, 
 
     }, 
 
     "displayName":"Bill Test - Newaygo" },  
 
{ 
 
     "employeeId":2, 
 
     "firstName":"Bob", 
 
     "lastName":"Test", 
 
     "email":null, 
 
     "phoneNumber":null, 
 
     "street":"1234 Sesame", 
 
     "city":"New York City", 
 
     "state":"New York", 
 
     "zip":"34555", 
 
     "activeFlag":true, 
 
     "homeLocationId":2, 
 
     "homeLocation":{ 
 
     "locationId":2, 
 
     "customerId":2, 
 
     }, 
 
     "displayName":"Bob Test - Newaygo" },  
 
{ 
 
     "employeeId":4, 
 
     "firstName":"John", 
 
     "lastName":"Doe", 
 
     "email":"[email protected]", 
 
     "street":"1234 Sesame St", 
 
     "city":"New York City", 
 
     "state":"New York", 
 
     "zip":"34555", 
 
     "activeFlag":true, 
 
     "homeLocationId":2, 
 
     "homeLocation":{ 
 
     "locationId":2, 
 
     "customerId":2, 
 
     }, 
 
     "displayName":"John Doe - Newaygo" },  
 
{ 
 
     "employeeId":5, 
 
     "firstName":"Bill", 
 
     "lastName":"Peterson", 
 
     "email":"[email protected]", 
 
     "street":"1234 test", 
 
     "city":"test city", 
 
     "state":"Maine", 
 
     "zip":"298379283", 
 
     "activeFlag":false, 
 
     "homeLocationId":2, 
 
     "homeLocation":{ 
 
     "locationId":2, 
 
     "customerId":2, 
 
     }, 
 
     "displayName":"Bill Peterson - Newaygo" },  
 
{ 
 
     "employeeId":6, 
 
     "firstName":"Jim", 
 
     "lastName":"Super", 
 
     "email":"[email protected]", 
 
     "phoneNumber":"459-456-4455", 
 
     "street":"1234 Sesame St", 
 
     "city":"New York City", 
 
     "state":"New York", 
 
     "zip":"34555", 
 
     "activeFlag":true, 
 
     "homeLocationId":2, 
 
     "homeLocation":{ 
 
     "locationId":2, 
 
     "customerId":2, 
 
     }, 
 
     "displayName":"Jim Super - Newaygo" } ] 
 

 
vm.allEmployeesOnJob = []; 
 

 
var pushes = [2,1] 
 
for(var i=0; i<pushes.length; i++) { 
 
    vm.allEmployeesOnJob[i] = vm.allEmployees[pushes[i]];     
 
} 
 

 
// The references are by reference: 
 
console.log("Are objects in allEmployeesOnJob the same references as allEmployees: " + (vm.allEmployeesOnJob[0] === vm.allEmployees[2] && vm.allEmployeesOnJob[1] === vm.allEmployees[1])); 
 

 
// More evidence: 
 
vm.allEmployees[2].employeeId= 999; 
 
console.log("allEmployees[2].employeeId= 999. allEmployeesOnJob[0].employeeId is now: " + vm.allEmployeesOnJob[0].employeeId);

METHODE 2

var vm = {}; 
 
vm.allEmployees = [ 
 
    { 
 
     "employeeId":1, 
 
     "firstName":"Bill", 
 
     "lastName":"Test", 
 
     "email":null, 
 
     "phoneNumber":null, 
 
     "street":"1234 Sesame", 
 
     "city":"New York City", 
 
     "state":"New York", 
 
     "zip":"34555", 
 
     "activeFlag":true, 
 
     "homeLocationId":2, 
 
     "homeLocation":{ 
 
     "locationId":2, 
 
     "customerId":2, 
 
     }, 
 
     "displayName":"Bill Test - Newaygo" },  
 
{ 
 
     "employeeId":2, 
 
     "firstName":"Bob", 
 
     "lastName":"Test", 
 
     "email":null, 
 
     "phoneNumber":null, 
 
     "street":"1234 Sesame", 
 
     "city":"New York City", 
 
     "state":"New York", 
 
     "zip":"34555", 
 
     "activeFlag":true, 
 
     "homeLocationId":2, 
 
     "homeLocation":{ 
 
     "locationId":2, 
 
     "customerId":2, 
 
     }, 
 
     "displayName":"Bob Test - Newaygo" },  
 
{ 
 
     "employeeId":4, 
 
     "firstName":"John", 
 
     "lastName":"Doe", 
 
     "email":"[email protected]", 
 
     "street":"1234 Sesame St", 
 
     "city":"New York City", 
 
     "state":"New York", 
 
     "zip":"34555", 
 
     "activeFlag":true, 
 
     "homeLocationId":2, 
 
     "homeLocation":{ 
 
     "locationId":2, 
 
     "customerId":2, 
 
     }, 
 
     "displayName":"John Doe - Newaygo" },  
 
{ 
 
     "employeeId":5, 
 
     "firstName":"Bill", 
 
     "lastName":"Peterson", 
 
     "email":"[email protected]", 
 
     "street":"1234 test", 
 
     "city":"test city", 
 
     "state":"Maine", 
 
     "zip":"298379283", 
 
     "activeFlag":false, 
 
     "homeLocationId":2, 
 
     "homeLocation":{ 
 
     "locationId":2, 
 
     "customerId":2, 
 
     }, 
 
     "displayName":"Bill Peterson - Newaygo" },  
 
{ 
 
     "employeeId":6, 
 
     "firstName":"Jim", 
 
     "lastName":"Super", 
 
     "email":"[email protected]", 
 
     "phoneNumber":"459-456-4455", 
 
     "street":"1234 Sesame St", 
 
     "city":"New York City", 
 
     "state":"New York", 
 
     "zip":"34555", 
 
     "activeFlag":true, 
 
     "homeLocationId":2, 
 
     "homeLocation":{ 
 
     "locationId":2, 
 
     "customerId":2, 
 
     }, 
 
     "displayName":"Jim Super - Newaygo" } ] 
 

 
var pushes = [2,1] 
 
vm.allEmployeesOnJob = [ 
 
       vm.allEmployees[2], 
 
       vm.allEmployees[1]     
 
       ]; 
 

 
console.log("Are objects the same (by ref)? " + (vm.allEmployeesOnJob[0] === vm.allEmployees[2] && 
 
      vm.allEmployeesOnJob[1] === vm.allEmployees[1])); 
 

 
// Further evidence: 
 
vm.allEmployees[2].employeeId = 999; 
 
console.log("allEmployees[2].employeeId was changed to 999. What is allEmployeesOnJob[0].employeeId now? " + vm.allEmployeesOnJob[0].employeeId);

+0

Also, da ich die Elemente im vm.allEmployees-Array referenziere, welche Objekte sind, sollte Methode 1 nicht immer die Elemente in vm.allEmployeesOnJob als Referenz setzen? –

+0

Können Sie mehr Code posten? Insbesondere was ist der Inhalt von 'vm.allEmployees'? –

+0

Ich habe die Bearbeitung über –

Verwandte Themen