Предполагается, что Array.slice()
позволяет мне сделать копию массива, а затем я могу изменить эту копию без изменения исходного массива, но когда я используйте Array.forEach()
над копией для удаления некоторых значений. Эти значения также удаляются из исходного массива. У кого-нибудь есть идея, почему это происходит? Вот код, который я использовал:Array.forEach() и Array.slice() вместе работают неправильно
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);
«Для ссылок на объекты (а не сам объект), ломтик копирует ссылки на объекты в новый массив И оригинал и новый массив обратитесь к одному и тому же объекту. Если объект, на который ссылается, изменяется, изменения видны как для нового, так и для оригинального массива ». из документации MDN для Array.prototype.slice() –