2015-08-24 18 views
6

Kod tabanım boyunca for döngülerinin yazılmasını önlemek için alt çizgiden yararlanmayı umuyordum. Ben şöyle bir for döngü yerine map kullanıyorum:Dizideki nesnelerin bir özelliğini değiştirmek için alt çizgi kullanın

body.tags = _.map(body.tags, function(tag) { 
    return { 
    id: tag.id, 
    userId: tag.userId, 
    createDate: tag.createDate, 
    tag: tag.tag.toLowerCase(), 
    }; 
}); 

Sorum şu, (tag ama her şeyi) değişen olmayacak özelliklerini belirtmeden bunu yapmanın bir yolu var mı? id: tag.id gibi alanları belirtmek için overkill gibi görünüyor. Eğer yapmaya çalıştığım şeyi yapmak tipik bir kullanım durumunda değil,

body.tags.forEach(function(t) { t.tag = t.tag.toLowerCase();}); 

map (yerli olsun, alt çizgi veya diğerleri) tüm değerleri dönüştürmek için kullanılır:

+0

body.tags bir dizidir? – Amit

+0

@Amit, yes 'body.tags', her biri' return' bloğu içinde gösterilen yapıya sahip bir nesne dizisidir. – MattDionis

+0

Eğer '_.map' yaklaşımınızı kullanmaya devam etmek isterseniz,' return _.extend (tag, {tag: tag.tag.toLowerCase()}); Ancak, 'forEach' kullanarak cevap daha iyidir. –

cevap

7

Hatta bunun için altını gerekmez Bununla. Ayrıca, basit bir for kullanmanız daha iyi performans gösterebilir çünkü burada işlev çağrıları gerekmez, ancak bu çalışma zamanı optimizasyonlarına bağlıdır. Bu yanıtla gelen fonksiyonu ve değil ile eşleştirme işlevini yerine eğer arada

, ayrıca istenen sonucu elde edersiniz, body.tags geri dönüş değeri ayarlayın.

+0

Bu doğru cevap, manipüle etmek istediğiniz nesneleri bulmak için alt çizgi/lodash kullanabilirsiniz. Daha hızlı olabilirdi, ama milyonlarca öğeniz yoksa, bunu kolay bir şekilde yapamazsınız;) – webdeb

5

Altyazı kullanarak bir koleksiyondaki tek bir özelliği değiştirmek için aşağıdaki kodu deneyebilirsiniz.

_.map(body.tags, function(tag) { 
    tag.tag = tag.tag.toLowerCase(); 
    return tag; 
}); 

yerli ForEach ve performansı üzerinde (kütüphane altını benzer) lodash haritasında yöntemi kullanmanın bir yararı yoktur. why lodash is faster than native forEach numaralı gönderiye dayanarak, lodash'ı hem alt çizgi hem de yerel forEach'in lehine kullanmak haklı olabilir. Bununla birlikte, "En yazılabilir, okunabilir ve sürdürülebilir olan yaklaşımı seçin" başlıklı kullanıcıyla aynı fikirdeyim.

+1

OP neden "bunu dene"? İyi bir cevap her zaman neyin yapıldığı ve niçin bu OP'nin sadece OP için değil, daha sonra da SO için ziyaretçilere açıklandığı bir açıklamaya sahip olacaktır. –

+1

Geri bildirim için teşekkürler Jay Blanchard. Söylediklerine katılıyorum. Sadece OP tarafından sorulan soruya cevap veriyordum. Açıkçası gelecekteki ziyaretçilerin bakış açısını düşünmüyordum. Bunu aklımda tutacağım. – invalidred

+2

Bu işe yaramaz çünkü haritaya aktarılan işlev hiçbir şey döndürmez. Bu arada, performans diğerine bir alternatif seçmek için son neden. En yazılabilir, okunabilir ve sürdürülebilir olan yaklaşımı seçin. –

İlgili konular