2013-08-24 50 views
5

我將2個數組傳遞給函數,並且想要將特定條目從一個數組移到另一個數組。 moveDatum函數本身使用underscorejs的方法拒絕和過濾。我的問題是,原始數組沒有改變,就好像我將數組作爲值傳遞,而不是作爲參考。具體條目被正確移動,但正如我所說,效果只是本地的。我必須改變什麼,才能讓原有陣列發生變化?更改數組傳遞給函數

調用該函數:

this.moveDatum(sourceArr, targetArr, id) 

功能本身:

function moveDatum(srcDS, trgDS, id) { 
    var ds = _(srcDS).filter(function(el) { 
     return el.uid === uid; 
    }); 
    srcDS = _(srcDS).reject(function(el) { 
     return el.uid === uid; 
    }); 
    trgDS.push(ds[0]); 
    return this; 
} 

感謝您的幫助

+1

你不能用'.filter()'或'.reject()'做這個,因爲它們會創建新的數組。你可以通過'trgDS.push(ds [0])'修改'trgDS'來改變'targetArr'的內容(就像你在做的那樣),因爲它們都指向同一個數組,但是你不能使'sourceArr'通過將'srcDS'分配給一個新數組來引用一個新數組。 – nnnnnn

+0

也許你可以發現這個問題,並解釋有用: http://stackoverflow.com/questions/6605640/javascript-by-reference-vs-by-value – Stefan

+0

@nnnnnn謝謝,我想我現在明白了什麼是繼續,基本上,我將srcDS引用到使用reject()創建的新數組中,並且失去了對我實際想要更改的原始傳遞數組的引用,是否有一種簡單的方法可以解決此問題? – macg

回答

2

複製在每場比賽都使用它修改陣列,例如方法刪除它之前splice

function moveDatum(srcDS, trgDS, id) { // you pass an `id`, not `uid`? 
    var i; 
    for (i = 0; i < srcDS.length; ++i) { 
     if (srcDS[i].uid === uid) { 
      trgDS.push(srcDS[i]); 
      srcDS.splice(i, 1); 
      // optionally break here for just the first 
      i--; // remember; decrement `i` because we need to re-check the same 
       // index now that the length has changed 
     } 
    } 
    return this; 
} 
+0

感謝你太mate =) – macg

+0

@macg如果你認爲保羅的答案是有幫助的考慮請upvote它。 – Stefan

+0

@Stefan我確實考慮過它,但是stackoverflow並不是很體貼,我只有13個聲望=)我需要兩個以上upvote – macg

3

正如評論所說,你要指定srcDS引用返回一個新的數組通過.reject(),從而失去了原來從函數外部傳入的數組的引用。

您需要直接在原來的陣列上執行你的數組操作,或許是這樣的:

function moveDatum(srcDS, trgDS, id) { 
    var ds; 
    for (var i = srcDS.length - 1; i >= 0; i--) { 
     if (srcDS[i].uid === id) { 
      ds = srcDS[i]; 
      srcDS.splice(i,1); 
     } 
    } 
    trgDS.push(ds); 
    return this; 
} 

我已經設置了循環往回走,這樣你就不必擔心當.splice()從陣列中刪除項目時,循環索引i不同步。向後循環也意味着ds結束引用srcDS匹配的第一個元素,這是我認爲你打算,因爲你的原始代碼有trgDS.push(ds[0])

如果你碰巧知道該數組只會包含正好一個匹配,那麼當然,如果你去向前或向後不要緊,你可以添加一個breakif內,因爲沒有點繼續循環一旦你有一場比賽。

(此外我認爲你有一個錯字,你是不是測試=== uid=== id。)

+0

感謝,作品像一個魅力 – macg