2016-11-30 71 views
1

有沒有辦法通過引用而不是按值來設置數組元素?JavaScript通過引用或按值賦值數組元素

例如,該方法通過值將數組元素:

方法1

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

並且該方法通過引用將數組元素:

方法2

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

我的用例:

我使用角自舉-duallistbox並且爲了正確初始化兩個列表框,將「NG-模型」陣列必須通過參考引用了「NG-選項」的數組元素。這是由於我讀過的解釋中的「select」DOM元素的行爲。我知道第二個是通過引用進行設置的原因是因爲列表框使用該方法正確更新,並且使用第一種方法不能正確更新。

有什麼區別?

有沒有辦法以編程方式將數組元素明確地通過引用設置爲另一個數組的元素?

編輯:

vm.allEmployees是僱員對象的數組。 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":"b[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

這沒有什麼用JavaScript本身,但更多與AngularJS的「ng-model」如何看待它的價值有關。我建議[編輯]您的問題和標題,以更清楚地表明您使用AngularJS。你也可以展示你如何綁定你的'ng-model'和'ng-options'這兩個選擇。 –

+0

關於角部@MikeMcCaughan的好處。然而,問題的JavaScript部分是我的問題的重大關注。斯科特的回答下面回答了這個問題,所以我想我可能會把這個問題的角度部分留給另一篇文章,如果我不能得到這個工作。 –

回答

2

在JavaScript對象通過引用和所有其他值(無論它們是否是在一個陣列或不)引用的由值所引用。你可以將你的值存儲在一個對象中,如果你需要獲取這個行爲,可以引用/傳遞它。

以下兩種方法都使用對象,並具有參考引用。這兩個片段驗證:

方法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);

方法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

因此,由於我引用了vm.allEmployees數組中的元素,它們是對象,所以不應該使用上面的方法1仍然通過引用設置vm.allEmployeesOnJob中的元素? –

+0

你能發表更多的代碼嗎?具體來說,「vm.allEmployees」的內容是什麼? –

+0

我已經編輯上述 –