2015-05-26 8 views
22

मैं निम्नलिखित संग्रह है:समकक्ष(), लेकिन लो-पानी का छींटा में सरणी के लिए

var columns = [ 
    { key:'url', width:20, type:'text' }, 
    { key:'title', width:21, type:'text' }, 
    { key:'desc', width:22, type:'text' }, 
    { key:'domain', width:23, type:'text' }, 
    { key:'user', width:24, type:'text' } 
]; 

मैं उठाया कुंजी के साथ वस्तुओं की एक सरणी मैप करने के लिए एक विधि के लिए देख रहा हूँ, साथ कुछ की तर्ज:

_.mapPick(columns, [width]) 
// [{width:20},{width:21},{width:22},{width:23},{width:24}] 

मैं जानता हूँ कि मैं इस तरह लो-डैश का विस्तार कर सकते हैं:

_.mixin({ 
    mapPick: mapPick:function (objs,keys){ 
     return _.map(objs, function (obj) { 
      return _.pick(obj,keys) 
     }) 
    } 

}); 

मुझे यकीन है कि नहीं कर रहा हूँ अगर वहाँ कुछ देशी समारोह है कि मुझे याद आ रही है।

मुझे एक समान प्रश्न मिला here लेकिन मैं अधिक लो-डैश मूल तरीके की तलाश में हूं।

+0

* * द्वारा "मुझे यकीन है कि कुछ देशी समारोह है कि वहाँ हूँ" "मूल" आप एक lodash विधि का मतलब है? प्रलेखन को देखते हुए, ऐसा लगता है कि आप कुछ भी याद नहीं करते हैं। –

+0

सही, 'lodash विधि'। मैं _method_ और _paramer_ –

उत्तर

21

मुझे लगता है कि map() + pick() दृष्टिकोण आपकी सबसे अच्छी शर्त है। इसके बजाय आप फिर भी एक इनलाइन समारोह बनाने की कॉलबैक रचना कर सकते हैं:

_.map(columns, _.partialRight(_.pick, 'key')); 
+14

के सही संयोजन का उपयोग न करके कुछ याद कर सकता हूं आपको समझना चाहिए कि 'partialRight' का उपयोग कठिन के लिए किया जाता है;) – aemonge

3

आप केवल कुंजियों में से एक चाहते हैं तो आप कर सकते हैं:

_.map(collection, 'key') 

आपका उदाहरण:

var columns = [ 
    { key:'url', width:20, type:'text' }, 
    { key:'title', width:21, type:'text' }, 
    { key:'desc', width:22, type:'text' }, 
    { key:'domain', width:23, type:'text' }, 
    { key:'user', width:24, type:'text' } 
]; 

var widths = _.map(columns, 'width'); 

widths 
[20, 21, 22, 23, 24] 
14

में मेरे मामले में मुझे टाइप करने के लिए भीस्ट की जरूरत है, और समस्या यह थी कि टीएस कंपाइलर एडम बोडेक समाधान का प्रतिनिधित्व करता है जो एक बुलियन लौटाता है, इसलिए मुझे ऐसा करने का थोड़ा आसान तरीका मिल रहा है:

_.map(columns, item => { return { key: item.key } }); 

इस मामले में आप कुछ नई संपत्ति भी जोड़ सकते हैं।

पीएस क्योंकि मैं एक टिप्पणी पोस्ट नहीं कर सकते मैं partialRight उपयोग यहाँ के बारे में विवरण जोड़ देगा:

_.map(columns, _.partialRight(_.pick, 'key')); 

पहले यदि u फोन _.map(array, func)समारोह हर सरणी तत्व के लिए बुलाया जाएगा। तो यह बराबर है: _.map(array, item => func(item))

दूसरा कॉल partialRight का परिणाम एक समारोह newFunc हो जाएगा, इसलिए हम एडम कोड का प्रतिनिधित्व कर सकते हैं:

var newFunc = _.partialRight(_.pick, 'key'); 
_.map(array, item => newFunc(item)); 

तीसरा हम के रूप में newFunc तर्क का प्रतिनिधित्व कर सकते हैं:

function newFunc(item) { 
    return _.pick(item, 'key') 
} 

अंत में मुझे लगता है कि इस समस्या के लिए सबसे समझा जा सकता और पठनीय समाधान है:

_.map(columns, item => _.pick(item, 'key')) 
+2

तीर फ़ंक्शन से सावधान रहें '=>' केवल ईएस 6-संगत ब्राउज़र में उपलब्ध है। सफारी/आईई समर्थन के लिए आप अच्छे पुराने अज्ञात फ़ंक्शन का उपयोग कर सकते हैं: '_.map (कॉलम, फ़ंक्शन (आइटम) {वापसी _.pick (आइटम, 'कुंजी')};' – bjunix

8

मैं map examples में सरल समाधान पाया:

var users = [ 
    {name:'David',age:35}, 
    {name:'Kate',age:28}, 
]; 
_.map(users,'age'); // [35,28] 
+0

यह अच्छा जवाब है, लेकिन यह वस्तुओं की सरणी वापस नहीं –

संबंधित मुद्दे