2015-09-02 54 views
1

我需要將對象發送給api。但是我需要在循環的每個步驟中更改對象的一個​​值。Javascript不想更改循環中的對象值

this.task = { 
    RowId: 0 
}; 

var taskWithFid = []; 
var fids = [1,2,3,4,5]; 
var taskTemp = this.task; 

fids.map(function(fid){      
    taskTemp.RowId = fid; 
    taskWithFid.push(taskTemp); 
}.bind(this)); 

我希望taskWithFid數組是這樣的:

[ 
    { RowId: 1 }, 
    { RowId: 2 }, 
    { RowId: 3 }, 
    { RowId: 4 }, 
    { RowId: 5 } 
] 

但我得到這個:

[ 
    { RowId: 5 }, 
    { RowId: 5 }, 
    { RowId: 5 }, 
    { RowId: 5 }, 
    { RowId: 5 } 
] 

你能幫助我嗎?

Here is the code:

<!DOCTYPE html> 
<html ng-app="myApp"> 

    <head> 
    <link rel="stylesheet" href="style.css"> 
     <script data-semver="1.2.13" src="http://code.angularjs.org/1.2.13/angular.js" data-require="[email protected]"></script> 
    <script src="script.js"></script> 
    </head> 

    <body ng-controller="MainCtrl as item"> 

    <h1>Hello Plunker!</h1 
    <div>{{item.taskWithFid}}</div> 
    </body> 

</html> 
+1

歡迎來到堆棧溢出!我編輯了你的問題來正確格式化代碼片段。我還在問題中包含了外部網站的一段代碼。祝你好運! – Wtower

回答

0

它應該是:

this.task = { 
     RowId: 0 
    }; 
var taskWithFid = []; 
var fids = [1,2,3,4,5]; 
fids.map(function(fid){ 
var taskTemp = {}; 
taskTemp.RowId = fid; 
taskWithFid.push(taskTemp); 
}.bind(this)); 

移動和改變var taskTemp = this.task;var taskTemp = {};

1

的問題是,你是推相同的對象到一個數組中,並同時做所以你正在改變它的RowId。所以,最後,當你將其更改爲5,一切都會5.您需要創建單獨的對象:

fids.map (function(fid) {      
    taskWithFid.push({RowId: fid}); 
}.bind(this)); 
0
var taskWithFid = []; 
var fids = [1,2,3,4,5]; 
var taskTemp 
fids.map(function(fid){ 
this.task = { 
     RowId: 0 
    }; 
taskTemp =this.task;      
taskTemp.RowId = fid; 
taskWithFid.push(taskTemp); 
}.bind(this)); 
console.log(taskWithFid); 
+0

雖然這可能是一個很好的答案,但請考慮增加一些關於爲什麼這是正確的解決方案以及你在做什麼的更多解釋:) –

0

this.task是覆蓋每次當你改變RowId

移動你task內部.map與新變量爲var task { // code },所以它每次創建新的變量。

這裏是working flunker

fid.map()應該是這樣的:

fids.map(function(fid){ 

    var task = { 
     DateCreated: now.toJSON(), 
     RowId: 0, 
     Subject: null 
    }; 
    task.RowId = fid 
    this.taskWithFid.push(task); 
    console.log('fid: '+fid); 
}.bind(this)); 
0

這裏是右側原因
在Javascript中的對象和陣列由參照推動。對象和數組不作爲副本推送。

在您的代碼中,當您正在執行以下幾行時,您只需將對象引用推送到數組。

taskTemp.RowId = fid; 
taskWithFid.push(taskTemp); 

最後,由於該引用,最後一個值正在改變所有值。

解決方案
我們只是需要我們每次推的時間創建一個單獨的對象。大部分答案在這裏都是正確的。但仍然是我的解決方案:

fids.map(function(fid){      
    this.taskWithFid.push({RowId: fid}); 
    console.log('fid: '+fid); 
}.bind(this));