它应该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);
答案 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()