我编写了下面的代码,试图将一个元素添加到新数组的开头并返回该新数组。它工作正常,但当我返回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一起修改?
答案 0 :(得分:1)
您应该克隆原始数组而不是引用它。一种方法是:
function addToFrontOfNew(arr, element) {
newArr = arr.slice();
newArr.unshift(element);
return newArr;
}
slice()方法返回浅拷贝...这是详细信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
答案 1 :(得分:-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()附加到函数的末尾。