2015-11-09 14 views
7

Çevrimiçi javascript alıştırmaları yapıyordum (codewars.com). Bir problem, kullanıcıdan bir dizi dizi nesne almasını ve dizinin bütününden bir seviye çıkarmasını istedi.Parametre çalışması olarak özellikle "[]" nasıl kullanılır?

[] /* becomes */ [] 
[[1, 2, 3], ["a", "b", "c"], [1, 2, 3]] /* becomes */ [1, 2, 3, "a", "b", "c", 1, 2, 3] 
[[3, 4, 5], [[9, 9, 9]], ["a,b,c"]] /* becomes */ [3, 4, 5, [9, 9, 9], "a,b,c"] 

Ben concat yöntemi hakkında öğrenme sona erdi, ama en popüler çözüm bu açıklamayı ...

function (arr){ 
    return [].concat.apply([],arr); 
} 

birisi burada [] kullanımını açıklayabilir misiniz kullanılan? Bunun doğru sonuçları nasıl ürettiğini anlayamıyorum (ve sayfada bir açıklama yapmıyor). Boş parantezlerin parametre ve etiketleme dizileri olarak kullanıldığı birçok zamanın olduğunu biliyorum. Bu nedenle, buradaki kullanımın anlaşılması, gelecekte kendimi kullanmam için bana yardımcı olabilir.

cevap

7

Bunu birden çok satıra bölebilirsiniz, böylece tanımlanması daha kolay olur. hat D açıklaması özellikle ..

[]   // A 
    .concat // B 
    .apply(// C 
     [], // D 
     arr // E 
    ); 
  • A bir Dizisi mi, ama burada sadece bu yüzden biz erişebilirler Array.prototype için bir kısayol olarak kullanarak ediliyor sorunuza yanıt budur
  • B o zaman, bir
  • ile ( apply kullanarak) çağırmak Array.prototype
  • C den concat yöntem Yeni Array ait
  • Dthis argüman üssü bizim önceki arr

Yani, Array.prototype kullanarak bu yeniden yazabilirsiniz oldu argümanlardan Nesne ve

  • E bir liste olmaya ve call
    var new_base_arr = []; 
    Array.prototype.concat.call(
        new_base_arr, 
        arr[0], 
        arr[1], 
        ... 
        arr[n] 
    ); 
    

    olduğunca yazılı daha tanıdık görünebilir Hangi
    new_base_arr.concat(arr[0], arr[1], ..., arr[n]); 
    

    Burada sorun ortadan kalkmaktadır

    bağımsız değişken belirsiz bir sayıda bir fonksiyonu çağıran bir.

  • +2

    Harika bir açıklama! Gittikçe güncellendiğinden beri birkaç kez okudum. Eğer [] .concat 've '([], arr)' 'da' [] 'in aynı dizi nesnesi olsaydı, başlangıçtan emin değildim. Array, 'Array.prototype' ve 'call' kullanarak yeniden yazma işleminizin bozulmasını ve bana nasıl daha tanıdık geldiğini tam anlamıyla kavradı. – JoeL

    İlgili konular