JavaScript dilinde birden fazla Array'i istenilen şekilde karıştırmak.
Selamlar,
Amacım birden fazla arrayı birbiriyle karıştırarak istediğim şekilde kombinlemek. Örnek vermek gerekirsek elimizde 2 adet array olsun.
let firstArray = ["40", "41", "42"];
let secondArray = ["Red", "Black"];
Amacım bu iki arrayı aşağıda ki gibi olacak şekilde yeni bir array haline getirmek.
let sonuc = [ ["40", "Red"], ["40", "Black"], ["41", "Red"], ["41", "Black"], ["42", "Red"], ["42", "Black"] ];
firstArray ve secondArray şeklinde 2 array belirttim array sayısı ve içlerinde ki eleman sayısı değişebilir. İstediğim şekilde nasıl arrayleri kombinlerim?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (3)
JavaScript'te birden fazla diziyi karıştırmak için concat() metodunu veya spread operator kullanabilirsiniz.
concat() metodu iki veya daha fazla diziyi birleştirir ve yeni bir dizi oluşturur.
spread operator (...) dizileri ayrıştırmak için kullanılır ve dizileri birleştirirken daha esnek bir yol sağlar.
Örneğin, aşağıdaki örnekte iki dizi ("dizi1" ve "dizi2") kullanılır ve concat() metodu ile birleştirilir.
const dizi1 = [1, 2, 3];
const dizi2 = [4, 5, 6];
const karisikDizi = dizi1.concat(dizi2);
console.log(karisikDizi); // [1, 2, 3, 4, 5, 6]
Aynı işlemi spread operator ile yapmak için :
const dizi1 = [1, 2, 3];
const dizi2 = [4, 5, 6];
const karisikDizi = [...dizi1, ...dizi2];
console.log(karisikDizi); // [1, 2, 3, 4, 5, 6]
Birden fazla diziyi karıştırmak isterseniz, dizileri rastgele sıralamak için sort() metodunu kullanabilirsiniz.
Ancak dizileri sıralamak için kullanılır o yüzden karıştırma olarak kullanamayız.
Onun yerine 'Fisher-Yates Shuffle Algorithm' yada benzeri bir algoritma kullanmanız önerilir.
function karisikDizi(arr) {
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]];
}
return arr;
}
Bu fonksiyon, gönderilen diziyi rastgele sıralar ve yeni bir dizi oluşturmaz.
ben de farkli bir ornek vereyim:
console.log(
firstArray.reduce((acc, curr) => [...acc, ...secondArray.reduce((a, c) => [...a, [curr, c]] ,[])] ,[])
)
const sonuc = firstArray.map(x=>secondArray.map(y=>[x, y])).flat(1);
veya
const sonuc = [];
firstArray.map(x=>{
sonuc.push(...secondArray.map(y=>[x,y]));
});
veya
const sonuc = [];
for(let i=0; i < firstArray.length; i++) {
for(let k=0; k < secondArray.length; k++) {
sonuc.push([firstArray[i], secondArray[k]);
}
}
Bu işlemi birkaç farklı yerde kullanacaksan fonksiyonlaştırmanı öneririm:
const matchSetsOneToOne = (set1, set2) => set1.map(x=>set2.map(y=>[x, y])).flat(1);
// Kullanırken:
const sonuc = matchSetsOneToOne(firstArray, secondArray);