.Map () bu durumda ne yapıyor?


95

Chrome Konsolu'nu kullanarak, bu benim girdi ve çıktı:

[0].map(Array);

[[0, 0, [0]]]; // output

Burada ne oluyor?

DÜZENLE

Bunun beni meraklandırmasının nedeni şudur:

[0].map(String);

Dönecek

["0"];

Ve yok

["0", "0", "String"]

34
Sanırım mutlu hissetmek için her zaman Javascript WTF'lere ihtiyacı var
npst

12
Oh, bu sadece daha az wtf-y varyantı['10', '10', '10'].map(parseInt)
gronostaj

2
Başka bir garip .map()davranış: stackoverflow.com/questions/14528397/… Genel olarak, .map()birden fazla argüman alan işlevleri kullanırken dikkatli olmalısınız .
barmar

2
Just do[0].map(console.log)
Bergi

1
@Jacksonkr: Cevap için teşekkürler. Sanırım şöyle oldu: JS WTF'leri görmenin beni mutlu ettiğini açıklayan bir yorum yazdım, dili çok sık kullanmak zorunda olmadığımı. Birisi, dili beğenmezsem neden JS sorularına bakacağımı sordu. npst yanıt verdi ve ilk iki yorum silindi. Yorumunun hâlâ olumlu oy alması komik, evet.
Eric Duminil

Yanıtlar:


123

.map()Fonksiyonu çağıran Array()üç parametreyle, bir dizi elemanı değeriyle fonksiyonu 0da, bu elemanın indisi 0ve tüm dizi için bir referans.

Yani bunu yapmak gibi:

var a = [0];
var index = 0
Array(a[index], index, a);   // create array with three elements

Ardından döndürülen Array()dizi, .map()oluşturan dizinin ilk öğesi olur , dolayısıyla [[0, 0, [0]]]sonucunuzdaki ekstra iç içe geçme düzeyi olur.

Düzenlemenizle ilişkin DÜZENLEME: derken [0].map(String);o sonuçları String()gibi aynı üç argümanla çağrıldığını String(a[index], index, a), ancak String()buna karşın işlevi, tüm ama ilk argüman yok sayar Array()kullandığı tüm argümanlar sağladı.


39

İlk olarak , Arraydiziler oluşturmak için bir işlev olarak kullanılabilir:

var arr = Array(1, 2, "Hello");

console.log(arr); // [1, 2, "Hello"]

İkincisi ,map çağrısına üç parametre aktarır: öğe, diziden dizini ve dizinin kendisi.

Dolayısıyla , diziniz bir öğe içerdiğinden, satır:

[0].map(Array);

eşdeğerdir:

[Array(0, 0, [0])];     // the element 0 in the original array will be mapped into Array(0, 0, [0])

6

Soruyu güncelledikten sonra. Diğer yanıtlar size harita hakkında bilgi verir

Dizi ve dizenin neden farklı olduğunu yanıtlamak için kuruculara bakın

Dize yapıcısı 1 parametreyi kabul eder String (şey) , dizi new Array (element0, element1 [, ... [, elementN]])


2
.map(Number)Her öğe için bir şey döndürmek yerine her öğeyi bir sayıya dönüştürmenin nedeni aynıdır [3, 2, [4, 1, 3]].
user4642212

@Xufox evet cevap kurucularda :)
Volodymyr Bilyachat

4

Bu çağrı

[0].map(Array);

şunun gibi bir şey yazmışsınız gibi aynı sonucu verir:

[0].map(function (value, index, array) {
    return Array(value, index, array);
})

Harita işlevi, üç parametreli Array işlevini çağırıyor : öğenin değeri, öğe dizini ve tüm dizi. Bu çağrı Arraysize 3 öğeli dizi döndürür: değer (sayı 0), dizin (sayı 0), tüm dizi ( [0]).

Ve bu yeni dizi orijinal Diziye sarılır, çünkü orijinal öğeyi (sayı 0) yeni öğeyle (3 öğeden oluşan dizi) eşlediniz.

Not: Aşağıdaki gibi yalnızca ilk parametreyi kullanmaya alışkın olabilirsiniz.

array.map(function (a) { return a * a; });

veya indeks almak için sadece ikisini kullanın

array.map(function (item, index) { return "index=" + index + ", value=" + item; });

Ancak mapyine de 3 parametre sağladığını hatırlamanız gerekir, sadece geri arama işlevinizde bunları yok sayarsınız. Kodun şöyle olmasının nedeni de budur:

[0].map(String);

İadeler

["0"]

Bunun nedeni, String işlevinin yalnızca ilk parametreyi önemsemesi ve diğer iletilen parametreleri yok saymasıdır. Eğer ararsan

String(11, "Some", "other", "ignored", "parameters")

yine alacaksın

"11"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.