2017-08-07 5 views
0

新しい配列の先頭に要素を追加してその新しい配列を返すために、以下のコードを記述しました。それはうまく動作しますが、newArrの代わりにarrを返すと、arrも変更されました。明示的に変更されていないにもかかわらず配列の値が変更されました

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

I書き込みした場合:

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')); 

**コメントに対処するためにCODE **

追加aをFIXEDエンドユーザが元の配列または新しい配列を返すことができるようにします。基本的に元の配列をカウントし、インクリメント= 0の場合は新しい配列を作成し、最初の要素を追加して残りの要素をループし、残りの要素を順番に配列にプッシュします。 switch文を使用すると、元の配列または新しい配列を返すことができます。コンソールログで動作し、jQueryを使用してタグに出力する場合は、関数の最後に.toString()を付加します。

+1

このコードは機能しません。 'alert'の代わりに' console.log'を使うと、結果が間違っていることがわかります。 '[arr.toString()]'は、あなたが思っているようなものを遠隔操作しません。 –

+0

配列の(浅い)コピーを作成する適切な方法は 'array.slice()'です – Barmar

+0

Jordan Running - 今すぐ試してみてください。 –

関連する問題