2017-08-07 63 views
0

我編寫了下面的代碼,試圖將一個元素添加到新數組的開頭並返回該新數組。它工作正常,但是當我返回arr而不是newArr時,arr也發生了變化。儘管沒有明確修改數組值,但修改了數組值

function addToFrontOfNew(arr, element) { 
    newArr = arr; 
    newArr.unshift(element); 
    return newArr; 
} 

如果我寫:

function addToFrontOfNew(arr, element) { 
    newArr = arr; 
    newArr.unshift(element); 
    return arr; 
} 

並測試與addToFrontOfNew函數([1,2],3)該函數將返回[3,1,2]。

如何重寫函數以使原始arr不會與newArr一起被修改?

+1

'return [element] .concat(arr)' –

+2

這是因爲在你的代碼中'newArr'和'arr'指的是同一個數組。你不克隆該陣列。檢查https://stackoverflow.com/questions/3978492/javascript-fastest-way-to-duplicate-an-array-slice-vs-for-loop – undefined

回答

-1
function addToFrontOfNew(arr,element,rv) 
{ 
    var len = arr.length; 
    for(i=0; i<len; i++) 
    { 
     if (i==0) { 
      newArr = [element,arr[0]]; 
     } else { 
      newArr.push(arr[i]); 
     } 
    } 

    switch(rv) 
    { 
     case 'arr': 
      return arr; 
     break; 

     case 'newArr': 
      return newArr; 
     break; 
    } 

} 
var fruit = ['cherries','apples','pears']; 
var newElement = 'bananas'; 

console.log(addToFrontOfNew(fruit,newElement,'arr')); 
console.log(addToFrontOfNew(fruit,newElement,'newArr')); 

**固定代碼,以解決意見**

增加了switch語句,以便最終用戶可以返回原始數組或新數組。基本上,它計算原始數組,創建新數組(如果increment = 0),添加第一個元素,然後遍歷數組的其餘部分,將剩餘元素按順序推入數組。 switch語句允許您返回原始或新的數組。在控制檯日誌中工作,如果使用jQuery將其輸出到標籤,只需將.toString()附加到該函數的末尾即可。

+1

此代碼不起作用。嘗試使用'console.log'而不是'alert',你會發現結果是錯誤的。 '[arr.toString()]'不會像你認爲的那樣遠程執行任何操作。 –

+0

製作數組(淺)副本的正確方法是'array.slice()' – Barmar

+0

Jordan Running - 現在就試試。 –