2015-06-12 5 views
18

छोड़ें मैं ऑब्जेक्ट्स की सरणी पर underscore.js _.map फ़ंक्शन का उपयोग करने की कोशिश कर रहा हूं, प्रत्येक ऑब्जेक्ट की संपत्ति के साथ सरणी प्राप्त करने के लिए। यही कारण है कि सामान्य परिदृश्य है, तो:Underscore.js _.map फ़ंक्शन: मान

var finalArray = _.map(myArray, function(obj) { 
    return obj.myProperty; 
}); 

लेकिन कुछ मामलों में मुझे लगता है कि कुछ भी नहीं सरणी में जोड़ा जा की जरूरत है। यह हो सकता है कुछ की तरह: इसी का परिणाम

var finalArray = _.map(myArray, function(obj) { 
    if (!obj.ignore) { 
     return obj.myProperty; 
    } 
}); 

कि एक undefined मान सरणी है, जो कुछ भी धक्का बिल्कुल नहीं के समान नहीं है में धकेल दिया जाता है।

क्या नक्शा फ़ंक्शन के लिए मूल्य को धक्का न देने का कोई तरीका है, या क्या मुझे अवांछित undefined के निकालने के लिए मेरे finalArray को पोस्ट-प्रोसेस करने की आवश्यकता है?

+0

मुझे लगता है कि आपको थॉमस एस्केमैन के सर्वोत्तम उत्तर के रूप में चुनने पर विचार करना चाहिए, क्योंकि यह ऐरे के सभी तत्वों के माध्यम से एक बार पूछता है, "क्या नक्शा फ़ंक्शन के लिए कोई मूल्य धक्का नहीं है", प्राथमिक लक्ष्य इस सवाल के लिए। और जवाब मानचित्र() के बजाय कम() का उपयोग होता है। –

+0

वर्तमान में चुना गया उत्तर प्रश्न के दूसरे भाग के लिए है "क्या मुझे अवांछित अपरिभाषित को हटाने के लिए मेरे अंतिमएरे को पोस्ट-प्रोसेस करने की आवश्यकता है?"। और उस दूसरे भाग का उत्तर यह है: नहीं, आपको अंतिम-प्रक्रिया() को पोस्ट-प्रोसेस करने की आवश्यकता नहीं है, आपको पोस्ट-प्रोसेसिंग से बचने के लिए मानचित्र() के बजाय कम() का उपयोग करने की आवश्यकता है। –

उत्तर

22

आप() _.map से पहले _.filter() का उपयोग करना चाहिए

var filteredArray = _.filter(myArray,function(obj) { 
    return !obj.ignore; 
}); 

var finalArray = _.map(filteredArray, function(obj) { 
    return obj.myProperty; 
}); 
+0

** ** के बाद, _before_ – hindmost

+5

नहीं, क्योंकि foucdeg उसकी समस्या का वर्णन करता है, इनपुट को बदलने के लिए इनपुट को बदलने की आवश्यकता नहीं है, उन्हें बाहर रखा जाना चाहिए या नहीं। ** ** पहले ** प्रदर्शन की अवधि में बेहतर है – couettos

+0

@ सबसे पहले दोनों काम करते हैं। – foucdeg

1

तो इसका मतलब यह आप फ़िल्टर करना चाहते है, तो अपने सरणी मैप करें।

underscore तरह से ऐसा करने के लिए, तो आप इस पाइप लाइन में अपने सरणी पारित करने के लिए की आवश्यकता होगी:

myArray ->फिल्टर ->नक्शा -> finalArray

var isIncluded = function(obj){ 
    return !obj.ignore 
} 
var takeProperty = function(obj){ 
    return obj.myProperty 
} 
var finalArray = _.map(_.filter(myArray, isIncluded), takeProperty ); 
+1

** नोट ** आप '_.pluck' फ़ंक्शन के साथ 'टेकप्रॉपर्टी' को किसी अन्य उत्तर में प्रस्तावित @ dev-null के रूप में प्रतिस्थापित कर सकते हैं। –

+0

@foucdeg अंडरस्कोर आपको एक वसा समारोह के बजाय छोटी इकाइयों में सोचता है जिसमें कई नौकरियां शामिल हैं *। आपको कार्य की छोटी इकाई लिखने के लिए प्रोत्साहित किया जाता है, प्रसंस्करण की एक बड़ी इकाई बनाने के लिए अनुक्रमिक संचालन में उनसे जुड़ें। –

4

.map सरणी के लिए एक नया मान मैप करेगा, आप सरणी फ़िल्टर करने के लिए .filter का उपयोग कर सकते हैं। FYI करें आप .pluck उपयोग कर सकते हैं एक वस्तु से एक संपत्ति मैप करने के लिए:

_.chain(myArray).where({ignore: false}).pluck('myProperty').value(); 

या::

_.chain(myArray).filter(function(obj) { return !obj.ignore; }).pluck('myProperty').value(); 

तुम भी .where इस तरह उपयोग कर सकते हैं

_.pluck(_.where(myArray, {ignore: false}), 'myProperty'); 
16

आप को कम इस्तेमाल कर सकते हैं:

myArray.reduce(function (acc, obj) { 
    if (!obj.ignore) { 
     acc.push(obj.myProperty); 
    } 
    return acc; 
}, []); 

या lodash साथ:

_.reduce(myArray, function (acc, obj) { 
    if (!obj.ignore) { 
    acc.push(obj.myProperty); 
    } 
    return acc; 
}, []); 
+3

मुझे लगता है कि यह सबसे अच्छा जवाब है, क्योंकि यह @foucdeg द्वारा पूछे जाने वाले सभी तत्वों के माध्यम से लूप करता है "क्या नक्शा फ़ंक्शन के लिए कोई मूल्य धक्का नहीं है"। जवाब मानचित्र() के बजाय कम() का उपयोग होता है। –

12

अकेले अंडरस्कोर तरीकों का उपयोग कर किया जा सकता है, points-free style:

var finalArray = _.chain(myArray) 
    .reject('ignore') 
    .pluck('myProperty') 
    .value(); 
+1

मुझे इस दृष्टिकोण से प्यार है। यह बस साफ और बहुत पठनीय है। (इसके अलावा * शुद्ध कार्यात्मक, monadic सोच *) –

+3

@Pavlo आपको अंडरस्कोर के साथ एक स्पष्ट '.chain' की आवश्यकता है और आप' .reject (_। संपत्ति ('अनदेखा' के बजाय '.reject (' ignore ') का उपयोग कर सकते हैं।)) '। http://jsfiddle.net/nikoshr/2gpvws1u/ – nikoshr

0

यहाँ एक और तरीका है। यह अंडरस्कोर में रचना समारोह का उपयोग करता है। क्यों लिखें? रचना गणित में श्रेणी सिद्धांत द्वारा समर्थित है। इस तरह भी बिंदु मुक्त है।

var pluckMyProp = function(array) { 
    return _.pluck(array, 'myProperty') 
} 

var reject = function(array) { 
    return _.reject(array, function(element) { 
     return element['ignore'] === true 
    }) 
} 

var finalArray = _.compose(pluckMyProp, reject) 
var data = [{myProperty: 1, ignore: false}, {ignore: true}, {myProperty: 2}] 


finalArray(data) //=> [1,2] 
+0

अंडरस्कोर से लोनाश में उपरोक्त रूपांतरित करने के लिए, '_.pluck' से' _map' और '_.compose' को' _.flowRight' में बदलें। – mrienstra

2

lodash के compact() का उपयोग करें। यह सभी झूठी मानों को हटाकर एक सरणी बनाता है।इस प्रकार, false, null, 0, "", undefined, और NaN हटा दिए गए हैं।

https://lodash.com/docs#compact

मैं उपयोग कर रहा हूँ यह-यह बहुत साफ है।