Array.forEach() 和 Array.slice() 不能正常工作
Array.forEach() and Array.slice() together doesn't work correctly
它应该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);
Slice 将创建数组本身的副本,但不会克隆数组中的对象(它们仍将是引用)。
您将需要递归地克隆您的数组及其内容或使用类似 Lodash 的 cloneDeep
Acording to this definition.
The slice() method returns a shallow copy of a portion of an array into a new array object.
浅拷贝是对象的按位拷贝。创建一个新对象,它具有原始对象中值的精确副本。如果对象的任何字段是对其他对象的引用,则只复制引用地址,即只复制内存地址。
要深度复制 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;
}
它应该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);
Slice 将创建数组本身的副本,但不会克隆数组中的对象(它们仍将是引用)。
您将需要递归地克隆您的数组及其内容或使用类似 Lodash 的 cloneDeep
Acording to this definition. The slice() method returns a shallow copy of a portion of an array into a new array object.
浅拷贝是对象的按位拷贝。创建一个新对象,它具有原始对象中值的精确副本。如果对象的任何字段是对其他对象的引用,则只复制引用地址,即只复制内存地址。
要深度复制 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;
}