2017-08-04 52 views
0

我有這個代碼,它改變了原來的數組ARR,即使當我將它複製到我命名副本的變量。 數據(ARR)由codewars排序功能改變副本和原始

cutIt(["codewars","javascript","java"]) 
function cutIt(arr){ 
    //coding here... 
    //step 1 go through array and find the shortest 
    // sort string by length 
    // make copy of arr not to affect it 
    let copy = arr; 
    console.log(copy); 
//[ 'codewars', 'javascript', 'java' ] 
    let sorted = copy.sort(function (a,b) { 
    return a.length - b.length; 

    }) 

    console.log(arr); 
    //[ 'java', 'codewars', 'javascript' ] 
} 

我沒有明確地改變陣列ARR在代碼提供,但輸出顯示它已經被改變?我認爲通過製作副本並對副本進行排序不會影響arr?

+0

排序()方法進行排序的陣列的代替元素並返回數組。您沒有製作數組的副本,只是參考的副本。 [文檔](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) – Matthew

+0

這兩個變量引用相同的數組,因此爲什麼原始更改嘗試創建一個新的包含與原始相同的元素的數組。 – Lixus

+0

謝謝我認爲我有一個更好的理解有點像第二個指針,以相同的變量... –

回答

2
// make copy of arr not to affect it 
let copy = arr; 

實際上並非如此;你只是做了第二個變量引用相同的數組實例。

您可以通過致電arr.slice()來創建實際副本。

+0

謝謝我不知道我指的是相同的內存位置。對於更簡單的類型,我確實如此:let i = 10;讓x = ii = i + 1現在i = 10但x = 11 ..我感謝你的幫助,你用切片解決了問題 –

0

數組不是原始數據類型。它們至多是對象的變體。對象通過引用傳遞,而不是值得注意的值。也就是說,如果這是意圖的話,有幾種方法可以對數組進行深度克隆。

1)香草JS:

E.g 

const newArraryCopy = <Your array>.slice(); 

2)Lodash:

E.g 

var array = [{},{},{}]; 

var copy = _.map(array, _.clone); 
+0

第二種方法現在超出了我的意思..var array = [{},{} {}]; var copy = _.map(array,_.clone);我不明白_.map等,但謝謝 –