从副本数组中删除一个项目,而不从原始数组中删除它

4

如何从数组的副本中删除一个对象,而不从原始数组中删除它?

我有一个全局变量:

    var userTrickList = [];

在一个函数内,我复制了那个全局数组:
    var tempUserTrickList = userTrickList;

然后我使用我创建的removeItem函数来删除特定的对象。
    removeItem(considerTrick.IDName, tempUserTrickList);


    function removeItem(item, list) {
        //takes a string as 'item', finds in the array as 'list', 
        //then removes it from the list.
        for(var i = 0; i < list.length; i++)
        {
            if(item === list[i])
            {
                list.splice(i,1);
            }
        }
    }

我的问题是,这个函数将其从userTrickList中删除了。

你有什么想法吗?显然,"removeItem(considerTrick.IDName, tempUserTrickList);" 中存在问题,但我想不到解决办法。

5个回答

14

我已经检查过了,这个方法不起作用。你必须使用slice而不是splice,因为splice会影响源数组。http://fiddle.jshell.net/QRK4Q/ - Balachandran
谢谢Daniel number 2!还有Manishankar!(number 1...)太棒了,完美运作:') 这个社区真是太棒了! - Daniel Archer
@Manishankar 您说得完全正确。我链接的示例正确使用了 slice,而我在复制时错误地添加了 p。感谢您的指正。 - Daniel
@Manishankar,我不确定你的意思是什么。我更新了我的答案,使用了slice(),这是合适的。 - Daniel
虽然这是正确的,但我添加了一个使用ES6扩展运算符的方法作为额外的答案。 - jswebb
显示剩余2条评论

2

针对您的需求,请使用此函数。

function removeElementFromArray(data,target) {
var temp=new Array();   
for ( var i = 0; i < data.length; i++) {
    if(data[i]!=target){
        temp.push(data[i]);
    }
}
return temp; }

这里的数据是原始数组,目标是你想从数组中删除的元素。此函数将返回不包含已删除项的数组。


1
尝试一下,它会复制原始数组。
var tempUserTrickList = JSON.parse(JSON.stringify(userTrickList));

演示 复制数组


0
for (i = 0, l = arr.length; i < l; i++) {
  if (arr[i] === item) {
    arr.splice(i, 1);
    i -= 1;
    l -= 1;
  }
}

虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - Christian

0
Daniel的克隆数组方法绝对正确,但由于我没有看到一个ES6导向的答案,我将提供另一种替代方案:
我们可以同样使用扩展运算符来克隆一个数组,这样我们就不必使用slice调用了。
const arr = [1, 2, 3];
const copy = [...arr];
copy.pop();
console.log(arr);  // returns [1, 2, 3]
console.log(copy); // returns [1, 2]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接