2016-02-15 74 views
0

我有,我相信是,奇怪的行爲,同時嘗試推入陣列。輸出數組時,我會看到預期值。如果我推入陣列然後輸出,我會得到重複的值。有問題的代碼:意外的價值被推到陣列

var test = "aab"; 
testA = test.split(""); 
permutations = []; 
generatePermutations(testA, testA.length); 

function generatePermutations(array, arrayLength) { 
     if (arrayLength === 1) { 
     console.log(array); // THIS OUTPUTS DIFFERENT PERMUTATIONS 
     permutations.push(array); 
     console.log(permutations); // VALUES IN ARRAY ARE ALL THE SAME 

     /* 
      permutations.push(array.join("")); 
      console.log(permutations); 
      SPLITTING THE STRING MAKES IT WORK FINE?! 
     */ 
     return; 
    } 

    for (var i = 0; i < arrayLength; i += 1) { 
     generatePermutations(array, arrayLength - 1); 

     if (arrayLength % 2 == 0) { 
      swapArrayElements(array, i, arrayLength - 1); 
     } else { 
      swapArrayElements(array, 0, arrayLength - 1); 
     } 
    } 
} 

function swapArrayElements(array, elementA, elementB) { 
    var temp = array[elementA]; 
    array[elementA] = array[elementB]; 
    array[elementB] = temp; 
} 

console.log(array)將輸出如預期的那樣排列。它將輸出所有排列作爲函數的復發:

['a','a','b'] ['a','a','b'] ['b','a' 'a'] ['a','b','a' ] ['a','b','a'] ['b','a','a']

如果我推的結果到另一陣列,permutations.push(array),每個元素具有相同的值:

[[ '一個', 'A', 'b'],[ '一個', 'A',' b'],['a','a','b'],['a','a','b'],['a','a','b'],['a' ','a','b']]

我得到預期的結果,如果我加入陣列,而將其推到排列:`permutations.push(array.join( 「」)):

[ 'AAB', 'AAB' '咩', 'ABA', 'ABA', '咩']

我缺少什麼嗎?我無法理解數組如何能夠包含一個在推入排列時突然發生變化的值。

爲了清楚起見,這是一個freecodecamp任務,我正在努力尋找不重複的排列。

+0

因爲你一遍又一遍地推着相同的數組。如果您想要數組的快照,請推送您之後永遠不會更改的副本。 –

+0

我確定我在這裏很密集,但是:我明白你在說什麼,但我不明白我是怎麼做到的。我所看到的是我推動排列組合。如果數組是「這是一個字符串」,並在下一次「這也是一個字符串」當然排列將最終成爲:[「這是一個字符串」,這也是一個字符串「]等等? –

+0

數組是引用類型,你正在向同一個數組推送多個引用 –

回答

1

您正在使用相同的數組變量,它總是引用相同的內存位置。因此,無論您在該陣列中進行何種更改,其變化與是否通過陣列或通過排列來訪問陣列無關,該陣列的所有元素都設置爲相同的陣列參考。

您可以通過添加陣列的複製到排列陣列,像這樣解決這個問題:

permutations.push(array.slice(0)); 

請注意,你有陣列值由字符串。如果它們是你也修改過的可變對象,那麼你需要進一步擴展這個解決方案。但在你的情況下,以上就足夠了。

+0

如此令人難以置信的顯而易見。噶爾!謝謝。 –