2017-11-01 98 views
8

ile iki diziyi Birleştirme:i farklı uzunluktaki 2 diziler birleştirmek istiyoruz alternatif Değerleri

let array2 = ["a", "b", "c", "d"]; 
let array2 = [1, 2]; 

let outcome = ["a",1 ,"b", 2, "c", "d"] 

iyi yolu bunu nedir?

Düzenleme: ben beklenebilir sonuç dizilerini dizisi yaratmak ["a", 1 ,"b", 2, "c", "d"]

+3

demek? Beklenen sonuç nedir? "birleşme" oldukça geniş bir kavramdır. –

+1

Son sonuç nasıl görünmeli? – noitse

+0

değişken değerleri ile dizi1'den 1, sonra dizi2'den biri gibi mi demek istiyorsunuz? – schylake

cevap

7

her iki dizinin dakika uzunluğunda yineleme ve inşa: Her demet, her bir dizi 1 elemanı, diziler arta kalan ürün dizilerini dizi yayılma ve ekleyerek dümdüz içerir Alternatif elemanları ve sonunda geri kalanını itin.

var array1 = ["a", "b", "c", "d"], 
 
    array2 = [1, 2], 
 
    result = [], 
 
    i, l = Math.min(array1.length, array2.length); 
 
    
 
for (i = 0; i < l; i++) { 
 
    result.push(array1[i], array2[i]); 
 
} 
 
result.push(...array1.slice(l), ...array2.slice(l)); 
 

 
console.log(result);
uyumlaştırma algoritması ve üstü düzleştirme Dizilerin keyfi sayım için

Çözüm.İşte

5

olduğunu.

const a1 = ["a", "b", "c", "d"]; 
 
const a2 = [1,2]; 
 
const l = Math.min(a1.length, a2.length); 
 

 
const merged = [].concat(...Array.from({ length: l }, (_, i) => [a1[i], a2[i]]), a1.slice(l), a2.slice(l)); 
 
    
 
console.log(merged);

+0

Array.from() ile .filter() 4.044921875ms almak ve result.push() almak 3.296630859375ms –

3

var array1 = ["a", "b", "c", "d"], 
 
    array2 = [1, 2], 
 
    result = [array1, array2] 
 
     .reduce((r, a) => (a.forEach((a, i) => (r[i] = r[i] || []).push(a)), r), []) 
 
     .reduce((a, b) => a.concat(b)); 
 
    
 
console.log(result);
Eğer kurucuların atama

const interleave = ([x,...xs], [y,...ys]) => 
 
    x === undefined && y === undefined 
 
    ? [] 
 
    : x === undefined 
 
     ? [y] .concat (ys) 
 
     : y === undefined 
 
     ? [x] .concat (xs) 
 
     : [x, y] .concat (interleave (xs, ys)) 
 
    
 

 
console.log (interleave ([0, 2, 4, 6], [1, 3, 5])) // [ 0 1 2 3 4 5 6 ]  
 
console.log (interleave ([0, 2, 4], [1, 3, 5, 7])) // [ 0 1 2 3 4 5 7 ] 
 
console.log (interleave ([0, 2, 4], []))   // [ 0 2 4 ] 
 
console.log (interleave ([], [1, 3, 5, 7]))  // [ 1 3 5 7 ] 
 
console.log (interleave ([], []))     // [ ]

kullanarak bunu yapabilirsiniz başka bir yolu Ve işte uygun bir kuyruk çağrısı kullanıyor

const interleave = ([x,...xs], [y,...ys], acc = []) => 
 
    x === undefined && y === undefined 
 
    ? acc 
 
    : x === undefined 
 
     ? acc.concat (y, ys) 
 
     : y === undefined 
 
     ? acc.concat (x, xs) 
 
     : interleave (xs, ys, acc.concat ([x, y])) 
 

 
console.log (interleave ([0, 2, 4, 6], [1, 3, 5])) // [ 0 1 2 3 4 5 6 ]  
 
console.log (interleave ([0, 2, 4], [1, 3, 5, 7])) // [ 0 1 2 3 4 5 7 ] 
 
console.log (interleave ([0, 2, 4], []))   // [ 0 2 4 ] 
 
console.log (interleave ([], [1, 3, 5, 7]))  // [ 1 3 5 7 ] 
 
console.log (interleave ([], []))     // [ ]

Ve yine kurucuların atama

const interleave = (xs, ys, acc = []) => 
 
    xs.length === 0 && ys.length === 0 
 
    ? acc 
 
    : xs.length === 0 
 
     ? acc.concat (ys) 
 
     : ys.length === 0 
 
     ? acc.concat (xs) 
 
     : interleave (xs.slice (1), ys.slice (1), acc.concat ([xs[0], ys[0]])) 
 

 
console.log (interleave ([0, 2, 4, 6], [1, 3, 5])) // [ 0 1 2 3 4 5 6 ] 
 
console.log (interleave ([0, 2, 4], [1, 3, 5, 7])) // [ 0 1 2 3 4 5 7 ] 
 
console.log (interleave ([0, 2, 4], []))   // [ 0 2 4 ] 
 
console.log (interleave ([], [1, 3, 5, 7]))  // [ 1 3 5 7 ] 
 
console.log (interleave ([], []))     // [ ]

Veya kuyruk çağrısı ve endeks bir arada kullanmadan - bu hızlı diğer parçacıkları ile karşılaştırıldığında ise ben en az tahsisat yaptıkça sağlandı, en az ara değer yarattı ve dolayısıyla daha az hesaplama sonrası çöp toplama - kazan/kazan/

const interleave = (xs, ys, i = 0, acc = []) => 
 
    xs.length === i && ys.length === i 
 
    ? acc 
 
    : xs.length === i 
 
     ? acc.concat (ys.slice (i)) 
 
     : ys.length === i 
 
     ? acc.concat (xs.slice (i)) 
 
     : interleave (xs, ys, i + 1, acc.concat ([xs[i], ys[i]])) 
 

 
console.log (interleave ([0, 2, 4, 6], [1, 3, 5])) // [ 0 1 2 3 4 5 6 ] 
 
console.log (interleave ([0, 2, 4], [1, 3, 5, 7])) // [ 0 1 2 3 4 5 7 ] 
 
console.log (interleave ([0, 2, 4], []))   // [ 0 2 4 ] 
 
console.log (interleave ([], [1, 3, 5, 7]))  // [ 1 3 5 7 ] 
 
console.log (interleave ([], []))     // [ ]

keskin i ve acc özel API sızdırılmış olduğunu fark edecektir kazanmak - bu kolayca bir loop yardımcı kullanarak giderildiği olabilir; Bu teknik ayrıca bir de interleave yığını güvenli hale getirir not olmayan kuyruk-call-optimize çevre yukarıda kıyasla

Yani, biz iki daha kazanır olsun, bu kazan/kazan/kazan/kazan yapma/kazan

Eğer "* * bunu yapmanın en iyi yolu nedir" ile ne

const recur = (...values) => 
 
    ({ type: recur, values }) 
 
    
 
const loop = f => 
 
    { 
 
    let acc = f() 
 
    while (acc && acc.type === recur) 
 
     acc = f (...acc.values) 
 
    return acc 
 
    } 
 

 
const interleave = (xs, ys) => 
 
    loop ((i = 0, acc = []) => 
 
    xs.length === i && ys.length === i 
 
     ? acc 
 
     : xs.length === i 
 
     ? acc.concat (ys.slice (i)) 
 
     : ys.length === i 
 
      ? acc.concat (xs.slice (i)) 
 
      : recur (i + 1, acc.concat ([xs[i], ys[i]]))) 
 

 
console.log (interleave ([0, 2, 4, 6], [1, 3, 5])) // [ 0 1 2 3 4 5 6 ] 
 
console.log (interleave ([0, 2, 4], [1, 3, 5, 7])) // [ 0 1 2 3 4 5 7 ] 
 
console.log (interleave ([0, 2, 4], []))   // [ 0 2 4 ] 
 
console.log (interleave ([], [1, 3, 5, 7]))  // [ 1 3 5 7 ] 
 
console.log (interleave ([], []))     // [ ]

İlgili konular