[Çözüldü] 2 farklı dizi oluşturamama
Aşağıdaki kod bloğumda 'arr' ve 'sourceList' adında 2 tane dizim var. Ben sourceList dizini arr değişkenine atıp arr değişkeninde değişiklik yapmak istiyorum. Fakat sourceList değişkeniminde içeriği değişiyor.
Yapmak istediğim arr değişkenim filtrelensin sourceList değişkenim sabit kalsın
Bunu nasıl yapabilirim ?
let sourceList = [
{
sourceName: 'ASdasd',
channels: [{
channelName : 'aaa'
}]
},
{
sourceName: 'ASdasd',
channels: [{
channelName : 'bbb'
}]
},
{
sourceName: 'ASdasd',
channels: [{
channelName : 'ddd'
}]
},
{
sourceName: 'ASdasd',
channels: [{
channelName : 'ggg'
}]
},
{
sourceName: 'ASdasd',
channels: [{
channelName : 'ssss'
}]
}
];
let arr = [...sourceList];
const searchParameter = 'bbb'
for(let source of arr) {
let _arr = source.channels.filter(c => {
return c.channelName.indexOf(searchParameter) > -1;
})
source.channels = _arr;
}
Çok güzel bir soru olmuş aslında :) Normal şartlarda eğer şöyle bir yapın olsaydı;
let array = ['test', 'deneme'];
let clone_array = array;
clone_array.push('yeni değer');
console.log(clone_array); // ["test", "deneme", "yeni değer"]
console.log(array); // ["test", "deneme", "yeni değer"]
referans alarak kopyalayacaktı. Ancak ES6 ile spread operatörünü kullanarak referanssız bir şekilde kopyalayabiliyoruz.
let array = ['test', 'deneme'];
let clone_array = [...array];
clone_array.push('yeni değer');
console.log(clone_array); // ["test", "deneme", "yeni değer"]
console.log(array); // ["test", "deneme"]
Ancak aynı örneği senin örneğindeki gibi dizi içerisinde obje tutarak yaparsak diziyi referanssız kopyalasada içindeki objeyi referanslı kopyalıyor. Dolayısı ile kopya dizide değişiklik yapınca mevcut diziyide etkiliyor.
let array = [
{
"name": "Tayfun",
"surname": "Erbilen"
}
];
let clone_array = [...array];
clone_array[0].name = "Recep";
console.log(clone_array); // {name: "Recep", surname: "Erbilen"}
console.log(array); // {name: "Recep", surname: "Erbilen"}
Biraz araştırma yaparak şöyle objeleride referanssız kopyalamak için JSON objesini kullanabilirsin.
let array = [
{
"name": "Tayfun",
"surname": "Erbilen"
}
];
let clone_array = JSON.parse(JSON.stringify(array));
clone_array[0].name = "Recep";
console.log(clone_array); // {name: "Recep", surname: "Erbilen"}
console.log(array); // {name: "Recep", surname: "Erbilen"}
Yani senin örneğinde ise şöyle olacak;
let sourceList = [
{
sourceName: 'ASdasd',
channels: [{
channelName : 'aaa'
}]
},
{
sourceName: 'ASdasd',
channels: [{
channelName : 'bbb'
}]
},
{
sourceName: 'ASdasd',
channels: [{
channelName : 'ddd'
}]
},
{
sourceName: 'ASdasd',
channels: [{
channelName : 'ggg'
}]
},
{
sourceName: 'ASdasd',
channels: [{
channelName : 'ssss'
}]
}
];
let arr = JSON.parse(JSON.stringify(sourceList));
const searchParameter = 'bbb'
for(let source of arr) {
let _arr = source.channels.filter(c => {
return c.channelName.indexOf(searchParameter) > -1;
})
source.channels = _arr;
}
console.log(arr);
console.log(sourceList);