2012-05-17 13 views
10

Ben diziler içeren bir dizi var ki, ben dizi içindeki her dizinin ilk elemanını dönmek istiyorum:İlk öğeyi çok boyutlu bir dizide döndürmek için alt çizgi zincir yöntemini nasıl kullanırsınız?

array = [[["028A","028B","028C","028D","028E"], 
      ["028F","0290","0291","0292","0293"], 
      ["0294","0295","0296","0297","0298"], 
      ["0299","029A","029B","029C","029D"], 
      ["029E","029F","02A0","02A1","02A2"]], 
     [["02A3","02A4"], 
      ["02A5", "02A6"]]; 

Ben böyle bir şey yapabileceğini biliyorum:

var firsts = []; 
_.each(array, function(item){ 
    _.each(item, function(thisitem){ 
    firsts.push(_.first(thisitem)); 
    }); 
}); 

ama ne alt çizgi _.chain() yöntemiyle yapmak istermiyim? Sadece alt yazıyı öğrenmek ve şimdiye kadar çok yararlı görünüyor.

cevap

29

Sen thusly flatten ve map ile bunu yapabileceğimi:

var firsts = _.chain(array) 
       .flatten(true) // This true is important. 
       .map(function(a) { return a[0] }) 
       .value(); 

Demo: http://jsfiddle.net/ambiguous/cm3CJ/

Bir dizi-of-the diziler içine senin dizi-of-the diziler-of-the diziler dönüştürmek için flatten(true) kullanmak ve daha sonra map her iç dizinin ilk elemanını soyar. Eğer map daha kısa bir şey istiyorsanız

, sen iç diziler ilk elemanını dışarı çekmek için pluck kullanabilirsiniz:

var firsts = _.chain(array) 
       .flatten(true) // This true is important. 
       .pluck(0) 
       .value(); 

Demo: http://jsfiddle.net/ambiguous/pM9Hq/

_.pluck zaten sadece map çağrısıdır:

// Convenience version of a common use case of `map`: fetching a property. 
_.pluck = function(obj, key) { 
    return _.map(obj, function(value){ return value[key]; }); 
}; 

Bu daha 01 gibi görünüyor Ruby'de kullanacağınız, bu nedenle pluck'a alışkın olduğunuzda bazı kişiler için daha tanıdık ve daha özlü olabilir. Eğer gerçekten bir şey Rubyish istiyorsanız, map olmayan bir anonim işlevini kullanabilirsiniz:

var first = function(a) { return a[0] }; 
var firsts = _.chain(array) 
       .flatten(true) // This true is important. 
       .map(first) 
       .value(); 
+2

Ben kullanımını buldum ** koparmak ** bu bağlamda çok ilginç. _seconds_, _thirds_ ve bunun gibi öğeleri ayıklamanın yolunu açar. En başından beri ** altçizgi ** kullanan Rubish çözümü, ilk satır olarak şu kodu kullanabilir: 'var first = function (a) {return _.first (a); }; '' –

+1

@ChaosManor: '' Önce '' adında '' İlk başta '' gerekmez. ''. –

İlgili konular