2013-02-12 30 views
0

我試圖寫一個陣列上執行操作並返回數組的不同副本,離開原來的不變的功能。我想我可以通過聲明var array2 = array然後繼續進行數組操作來做到這一點。我究竟做錯了什麼?試圖離開輸入參數不變

這裏是我的示例函數:

var partition = function(array, p){ 
    var pivot = array[p]; 
    var length = array.length; 
    // make a copy and move pivot to the front 
    var array2 = array; 
    array2[p] = array2[0]; 
    array2[0] = pivot; 
    // partition the array 
    var i = 1; 
    for (var j = 1; j < length; j++){ 
     //console.log('i='+i+', j='+j) 
     if (array2[j] < pivot) { 
      var temp = array2[j]; 
      array2[j] = array2[i]; 
      array2[i] = temp; 
      i++; 
     } 
    } 
    //console.log('array after partitioning: ' + array) 
    // swap pivot 
    array2[0] = array2[i-1]; 
    array2[i-1] = pivot; 
    var answer = {array: array2, p: i-1} 
    return answer; 
}; 

而且我調用示例:

var a = [3, 2, 1]; 
partition(a, 0); 
console.log(a); // prints [1,2,3] but I want [3,2,1] 
+0

陣列和在JavaScript對象通過引用傳遞,而不是值。如果您不希望維護該引用,則需要您執行克隆。 – Nucleon 2013-02-12 07:21:49

回答

1

添加此行而不是array2=array,因爲它僅創建對array的引用,而不是新的array2。

var array2 =array.slice(0); //it will create a new array not the reference. 

小提琴http://jsfiddle.net/N64w3/

1

var array2 = array.slice(0)或只是array.slice()將克隆你的陣列

Here你必須參考該