Array.forEach()和Array.slice()一起工作不正常

时间:2016-06-10 16:32:08

标签: javascript arrays slice

它应该Array.slice()让我制作一个数组的副本,然后我可以在不修改原始数组的情况下修改该副本,但是当我在副本上使用Array.forEach()时要删除某些值,也会从原始数组中删除此值。有人知道为什么会这样吗? 以下是我使用过的代码:

var originalArray = [
    { id: 1, name: 'Sales', datasources: [
        { id:1 , name: 'datasource1', fields: [] },
        { id:2 , name: 'datasource2', fields: [] },
    ] },
    { id: 4, name: 'Accounts', datasources: [
        { id:3 , name: 'datasource3', fields: [] },
        { id:4 , name: 'datasource4', fields: [] },
    ] },
    { id: 123, name: 'my datasources', datasources: [
        { id:1 , name: 'datasource1', fields: [] },
        { id:2 , name: 'datasource2', fields: [] },
        { id:3 , name: 'datasource3', fields: [] },
        { id:4 , name: 'datasource4', fields: [] },
    ] },
    { id: 12, name: 'shared datasources', datasources: [
        { id:13 , name: 'myshared datasource', fields: [] },
        { id:16 , name: 'hello test', fields: [] },
    ] },
];

var copyOfOriginalArray = originalArray.slice();

copyOfOriginalArray.forEach((folder, index) => {
    folder.datasources = folder.datasources.filter((o) => { return o.name.trim().toLowerCase().includes('hello'); });
});

JSON.stringify(originalArray);
JSON.stringify(copyOfOriginalArray);

2 个答案:

答案 0 :(得分:5)

  

根据this definition。   slice()方法将数组的一部分的浅拷贝返回到新的数组对象中。

浅拷贝是对象的逐位拷贝。创建一个新对象,该对象具有原始对象中值的精确副本。如果对象的任何字段是对其他对象的引用,则仅复制引用地址,即仅复制存储器地址。

用于深度复制javascript中的任何对象,您可以使用此功能:

function deepCopy(oldObj) {
   var newObj = oldObj;
   if (oldObj && typeof oldObj === 'object') {
       newObj = Object.prototype.toString.call(oldObj) === "[object Array]" ? [] : {};
       for (var i in oldObj) {
           newObj[i] = deepCopy(oldObj[i]);
       }
   }
   return newObj;
}

答案 1 :(得分:4)

Slice将创建数组本身的副本,但它不会克隆数组中的对象(那些仍然是引用)。

您将需要递归克隆您的数组及其内容或使用Lodash的event.preventDefault()

之类的内容