2012-05-24 8 views
5
underscore.map

मैं निम्नलिखित वस्तुबारे

{one : 1, two : 2, three : 3} 

है और मैं

[1,2] 

यहाँ मेरी कोड चाहते हैं

_.map({one : 1, two : 2, three : 3}, function(num, key){ 
     if (key==='one' || key==='two') { 
      return num; 
     } 
}); // [1, 2, undefined] 

असल में मैं चाहूँगा [1,2]

कैसे क्या मैं अपना सी सुधार सकता हूं स्तोत्र?
धन्यवाद

उत्तर

9
_.values(_.pick(obj, "one", "two")) 
+4

धन्यवाद, अंडरस्कोर दस्तावेज़ों को हर कुछ महीनों में शुरू होने से शुरू करने के लायक है। उपयोगी सामान के टन। –

3

मुझे नहीं लगता है कि वहाँ के लिए संभावना में एक निर्मित ( में जैसे आप उस उद्देश्य के लिए flatMap उपयोग कर सकते हैं) है। में श्रृंखलित विचार map और filter:

_({one : 1, two : 2, three : 3}). 
    chain(). 
    map(function(num, key){ 
    if (key==='one' || key==='two') { 
     return num; 
    } 
    }). 
    filter(function(num) { 
    return num !== undefined 
    }). 
    value(); 

अद्यतन (प्रति @ZacharyK टिप्पणी): या reject पूरक filter करने के लिए उपयोग: दो भागों में

reject(function(num) { 
    return num === undefined 
}) 
0

यह तोड़ चरणों। (हालांकि

_.map(['one','two'], function(key) { return obj[key]; }); 

जो [1, 2]

देखें का मूल्यांकन: पहले मान चुनने के लिए एक फिल्टर का उपयोग आप तो नक्शे का उपयोग करना चाहते हैं मानों

_({..}).chain() 
     .filter(function(num, key){ 
      return key ==='one'||key==='two'; 
     }) 
     map(function (num,key){ 
      return num; 
     }).values() 
+0

आप 'फ़िल्टर' विधि कॉल और' मानचित्र 'के बीच' '' खो रहे हैं। इसके परिणामस्वरूप वस्तु को पारित करने की विधि के बजाय 'मानचित्र' को एक अलग कार्य के रूप में माना जाएगा। –

+0

ओह आपको अच्छा पकड़ –

-1

तुम क्यों उपयोग नहीं करते हैं पाने के लिए नोड प्रतिलिपि के कारण मुझे __ पर अंडरस्कोर को उपनाम करना है):

> var __ = require('underscore'); 
> var obj = {one : 1, two : 2, three : 3}; 
> __.map(['one','two'], function(key) { return obj[key]; }); 
[ 1, 2 ] 
2

दो चरणों में यह करने के लिए एक और विकल्प है, पहले map तो compact

उदाहरण::

myArray = _.map({one : 1, two : 2, three : 3}, function(num, key){ 
     if (key==='one' || key==='two') { 
      return num; 
     } 
    }); 

myArray = _.compact(myArray) 

यह समाधान की तुलना में सरणियों के लिए बेहतर काम करता है +४६५१०४०३२१० आप वास्तव में _.pick और _.values उपयोग करना चाहते हैं वस्तुओं।

_.compact (सरणी):

हटाया सभी falsy मूल्यों के साथ सरणी की एक प्रतिलिपि देता है। जावास्क्रिप्ट, झूठी, शून्य, 0, "", अपरिभाषित और NaN सभी झूठी हैं।

+0

यह वह है जिसे मैंने उपयोग किया था। –

2

अन्य उत्तरों में वस्तु की लंबाई के माध्यम से कम से कम दो लूप शामिल होंगे।क्या आप वास्तव में चाहते हैं _.reduce है:

_.reduce({ one : 1, two : 2, three : 3 }, function (out, num, key) { 
    if (key === 'one' || key === 'two') { 
     out.push(num); 
    } 
    return out; 
}, []); 
// [1, 2] 

आप अपने जवाब, जमा बस के रूप में आप इसे पसंद है, अपने वस्तु के माध्यम से सिर्फ एक पाश के साथ दे देंगे कि।

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