2012-05-17 24 views
10

मैं सरणियों की एक सरणी है कहो, और मैं सरणी के भीतर प्रत्येक सरणी के पहले तत्व लौटना चाहते:मल्टीडिमेंटल सरणी में पहली आइटम को वापस करने के लिए आप अंडरस्कोर की श्रृंखला विधि का उपयोग कैसे करते हैं?

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"]]; 

मैं जानता हूँ कि मैं कुछ इस तरह कर सकते हैं:

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

लेकिन क्या अगर मैं अंडरस्कोर _.chain() विधि के साथ ऐसा करना चाहता हूं? बस अंडरस्कोर सीखना, और अब तक बहुत उपयोगी लगता है।

उत्तर

29

आप thusly flatten और map साथ यह कर सकता है:

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

डेमो: http://jsfiddle.net/ambiguous/cm3CJ/

आप flatten(true) का उपयोग एक सरणी के-विन्यास में, अपने सरणी के-सरणियों के- सरणियों कन्वर्ट करने के लिए और फिर map प्रत्येक आंतरिक सरणी के पहले तत्व को बंद कर देता है।

आप कुछ map की तुलना में कम चाहते हैं, आप pluck इस्तेमाल कर सकते हैं भीतरी सरणियों के पहले तत्व बाहर निकलने के लिए:

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

डेमो: http://jsfiddle.net/ambiguous/pM9Hq/

_.pluck वैसे भी सिर्फ एक map कॉल है:

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

यह एक 01 की तरह बहुत अधिक दिखता हैजो आप रूबी में उपयोग करेंगे, तो यह कुछ लोगों के लिए अधिक परिचित हो सकता है और एक बार जब आप pluck पर उपयोग कर लेंगे तो अधिक संक्षिप्त हो सकता है। क्या तुम सच में चाहते हैं कुछ Rubyish, आप map के साथ एक गैर-अनाम समारोह इस्तेमाल कर सकते हैं:

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

मैं के उपयोग पाया ** प्लक ** इस संदर्भ में बहुत ही दिलचस्प। यह _seconds_, _thirds_, और इसी तरह निकालने का तरीका प्रशस्त करता है। बहुत शुरुआत के बाद से ** अंडरस्कोर ** का उपयोग कर रूबिश समाधान, निम्न कोड के रूप में पहली पंक्ति के रूप में उपयोग कर सकता है: 'var first = function (a) {return _.first (a); }; ' –

+1

@CosManor: आपको अपने अंडरस्कोर में 'पहले' की भी आवश्यकता नहीं है, '_.first' है, आप बस' .map (_। First) 'कह सकते हैं। –