2013-07-23 17 views
45

underscore docs geçmekte oldum ama şu dönüştürmeyi yapmak için bir yöntem (veya iç içe yöntem çağrısı) bulamıyorum:Underscore.js - Harita Bir nesnenin anahtar/değer çiftleri dizisi - Tek liner

[{ "name" : "sEcho", "value" : 1},{ "name" : "iColumns", "value" : 12}, ... ] 

Ve aşağıdaki nesne haline dönüştürmek gerekir:

{ 
     sEcho: 1, 
     iColumns: 12, 
     ... 
} 

bunu öylesine bir sebebi underscore.js kullanıyorum

ı aşağıdaki JavaScript dizi var diyelim , tek bir astar olarak olmalıdır.

+1

Bir çizgi gerçi? _.map (arr, function (v, o) {o = {}; o [v.name] = v.value, o}); 'Yapmanın daha kısa bir yolu olup olmadığından emin değilsiniz ... – elclanrs

+0

@elclanrs Bu bir dizi nesne yaratacaktır.Sadece bir nesne istiyorsun. –

+0

@AaditMShah: Doğru, sonra yanlış anladım ... – elclanrs

cevap

52

kimse gönderdi yana Bu bir cevap olarak, ben yayınladım çünkü ben Jan's answer daha iyi olduğunu düşünüyorum. Satır içi işlevi olmadan daha kısa ve daha temiz.

_.object(_.pluck(data, 'name'), _.pluck(data, 'value')); 
+2

için AFAICS altyazısı, "pluck" ve "map" sonuçlarının herhangi bir sırasını açık bir şekilde garanti etmez, bu nedenle mevcut tarayıcılarda çalışsa bile, ona güvenmezdim. Değerlerin yanlış tuşlara atanmış olduğu bir hatayı izlemek ne kadar zor olduğunu düşünün. – peterp

+0

Söylediğiniz doğru, ancak OP'nin açıkça aynı siparişi istemediğini not edeceğim. –

+0

Haritadaki anahtar/değer çiftlerinin sırasını endişelendirmedim (AFAIK, artık JS'de bunun garantisi var), ancak yanlış tuşlara atanan değerler. Bazen, bazı tarayıcılarda, adların koparılması *, verilerinizi tamamen dağıtan ve örn. Beklenen sonuç yerine {sEcho: 12, iColumns: 1} '. İşte bu yüzden “değer” veya “map” – peterp

27

Bu yapmalıyım:

tek astar (sağ, dalga mı geçiyorsun?) Gibi
_.reduce(array, function(o, v){ 
    o[v.name] = v.value; 
    return o; 
}, {}); 

:

_.reduce(array,function(a,b){a[b.name]=b.value;return a},{}); 
+0

Neden "b.value" değerlerini toplıyorsunuz? Neden basit değil a [b.name] = b.value'? –

+0

@muistooshort Onları toplaması gerektiğini düşündüm, gerçekten neden xD – Esailija

+5

İstenilen bir toplama göremiyorum. Ve eğer bir tek-liner ile zeki olmaya çalışıyorlarsa (başka ne gibi bir sebep olabilirdi?) O zaman siz de bakıcılar için nefretiniz hakkında bir şey yapıp bir virgül operatörüne atıyor olabilirsiniz: '_ (a). (işlev (m, h) {dönüş m [h.name] = h.değer, m}, {}). Heh. –

3
var a = [{ "name" : "sEcho", "value" : 1},{ "name" : "iColumns", "value" : 12} ]; 

var o = {}; _.each(a, function(e) { o[e.name] = e.value; }); 

console.log(o); 
// Object {sEcho: 1, iColumns: 12} 
6

en aşağıdaki JavaScript dizisi var diyelim:

var list = [ 
    { 
     name: "sEcho", 
     value: 1 
    }, 
    { 
     name: "iColumns", 
     value: 12 
    }, 
    ... 
]; 

aşağıdaki gibi ou istiyorum:

var table = _.reduce(list, function (table, item) { 
    table[item.name] = item.value; 
    return table; 
}, {}); 

O bir liner değil, ama ben tam anlamıyla bir astar demek sanmıyorum. Sen mi yaptın

Burada gerçekten bir astar anlamına gelse bir astar var:

var t = _.reduce(list, function (t, i) { return t[i.name] = i.value, t; }, {}); 

Evet, başkalarının aynı cevabı vermişlerdir. Ancak bu sadece sorunun cevabı çok basit olduğu için. _.object imzası "çiftleri dizisi" kullanılarak

6
var names = _.pluck(data, 'name'); 
var values = _.pluck(data, 'value'); 
var result = _.object(_.zip(names, values)); 
console.log(result); 
+2

+ 1 Birinin, nispeten iyi bilinen bir yöntem (azaltma) kullanarak yapabileceği aynı miktarda kod içinde bir şey yapmak için 3 ayrı daha az bilinen, özel yöntemlere gereksinim duyduğuna dikkat etmek ilginç olsa da. – Esailija

58

Varyasyon Sza's answer üzerine,: I azaltmak kullanmak

_.object(_.map(data, function(x){return [x.name, x.value]})) 
+2

Güzel! Typescript kullanıyorsanız bile birkaç tuş vuruşu kaydedin;) '_.object (_. Map (veri, (x) => {return [x.name, x.value]})) – parliament

+1

@parliament veya coffeescript :-) –

+3

Ayrıca, Sza'nın örneği, zip olmadan çalışır (çünkü nesne, tek bir ad/değer çifti dizisi veya iki farklı dizi alır). Yani _.object (_pluck (data, 'name'), _.pluck (data, 'value')) '' – ShawnFumo

2

mükemmel bir yer düşünüyorum:

_.reduce(ary, function(memo, obj){ memo[obj["name"]] = obj["value"]; return memo }, {});

+1

doh, geç – user2240431

0
var arr = [{ "name" : "sEcho", "value" : 1},{ "name" : "iColumns", "value" : 12}] 

ES6

_.mapObject(_.indexBy(arr, 'name'), (v) => v.value) 

ES5

_.mapObject(_.indexBy(arr, 'name'), function (v) { return v.value; }) 

Bu yineler iki kez

İlgili konular