v2.5.2
Giriş yap

[Çözüldü] 2 farklı dizi oluşturamama

selim
961 defa görüntülendi ve 1 kişi tarafından değerlendirildi

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;
 }

tayfunerbilen
1658 gün önce

Ç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);