2016-03-10 22 views
9

Haritanın davranışıyla oldukça kafa karıştırıyorum().Neden bir dizide bir js dizisi orijinal diziyi değiştiriyor?

böyle nesneler dizisi var:

const products = [{ 
    ..., 
    'productType' = 'premium', 
    ... 
}, ...] 

ve ben aynı diziyi dönmelidir bir işleve ancak tüm ürün ile bu diziyi geçiyorum yapılan serbest:

[{ 
    ..., 
    'productType' = 'free', 
    ... 
}, ...] 

fonksiyonudur: aşağıdaki dizi döndürür

const freeProduct = function(products){ 
    return products.map(x => x.productType = "free") 
} 

:

["free", "free", ...] 

Yani ben olmak benim işlevini yeniden yazdı: amaçlandığı gibi diziye döner

const freeProduct = function(products){ 
    return products.map(x => {x.productType = "free"; return x}) 
} 

.

AMA! Ve bu, her iki durumda da orijinal ürünler dizilimin değiştirildiği zaman, aklımdan kaçtığım an.

Haritadaki() dokümanlar(), bunun olmaması gerektiğini belirtir (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map).

Hatta bu

const freeProduct = function(products){ 
    p = products.splice() 
    return p.map(x => {x.productType = "free"; return x}) 
} 

gibi benim işlevi dönüm benim dizinin bir klonu oluşturmak için çalıştı Ama hala (beni deli başlar) aynı sonucu alabilirsiniz.

Neyi yanlış yaptığımı açıklayabilecek herkese çok minnettar olurum!

Teşekkür ederiz

cevap

26

Orijinal dizinizi değiştirmiyorsunuz. Dizideki nesneleri değiştiriyorsunuz. Eğer == olsaydı -

const freeProduct = function(products) { 
    return products.map(x => { 
    return Object.assign({}, x, { 
     productType: "free" 
    }); 
    }); 
}; 
+0

Merhaba. Yukarıdaki kodda "=>" ne anlama geliyor? –

+1

@HarshaKanchina Bu, ES6'da eklenen yağ ok fonksiyonu sözdizimi. [Burada] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions#Arrow_Functions) MDN'de bunun hakkında bazı bilgiler. – SimpleJ

+0

Javascript işlevsel bir dil gibi davranıyor, ama aynı sınıf anahtar kelimesi gibi, bu kafa karıştırıcı, kasıtsız ve çok zaman harcıyor. 'Orijinal dizinizi değiştirmiyorsunuz. Dizideki nesneleri değiştiriyorsunuz - bu cevap doğru olsa da mantıksızdır çünkü gerçek dünyada bir şeyin parçalarını değiştiremezsiniz ve aynı kalmasını sağlayın. – Cobolt

8

SimpleJ cevabı üzerinde durmak için: Eğer dizideki nesneleri mutasyona kaçınmak istiyorsanız, orijinalin özellikleri artı gereken değişiklikler ile yeni bir nesne oluşturmak için Object.assign kullanabilirsiniz = iki dizide, eşlenmiş dizinin aslında yeni bir dizi olduğunu doğrulayan eşit olmaz (bellekte aynı adres değil). Sorun, yeni diziyi döndürmenizdir. Bu, orijinal dizideki SAME nesnelerinin referanslarıyla dolu (yeni nesne değişmezlerini döndürmüyor, aynı nesneye başvurular döndürülüyor). Yani eski nesnelerin kopyaları olan yeni nesneler yaratmanız gerekiyor - örneğin, SimpleJ tarafından verilen Object.assign örneği.

İlgili konular