जावास्क्रिप्ट मानचित्र फ़ंक्शन अपरिभाषित क्यों लौटता है?


114

मेरा कोड

 var arr = ['a','b',1];
 var results = arr.map(function(item){
                if(typeof item ==='string'){return item;}  
               });

यह निम्नलिखित परिणाम देता है

["a","b",undefined]

मैं परिणाम सरणी में अपरिभाषित नहीं चाहता। मैं यह कैसे कर सकता हूं?


3
क्योंकि आप कुछ भी वापस नहीं करते हैं जब तक कि यह एक स्ट्रिंग नहीं है। इसलिए, अंतिम आइटम वापस आ जाता है undefined। यदि यह एक तार नहीं है तो आप क्या वापसी की उम्मीद करते हैं? एक खाली तार?
BenM

2
@BenM अगर यह एक स्ट्रिंग नहीं है, तो मुझे कुछ भी नहीं चाहिए। मैं अपरिभाषित भी नहीं हूं।
अक्षत जीवन शर्मा

4
ऐसा लगता है कि मैं ऐसा करने के लिए गलत तरीके का उपयोग कर रहा था। मैं सुझाव के अनुसार फ़िल्टर का उपयोग करूंगा।
अक्षत जीवन शर्मा

आप एक उत्तर स्वीकार करना चाह सकते हैं।
इक्के

3
jQuery.map वास्तव में काफी स्मार्ट है जिसके परिणामस्वरूप सरणी में अपरिभाषित और शून्य मान शामिल नहीं हैं।
डोनाल्ड टेलर

जवाबों:


179

आप इस मामले में कुछ भी नहीं लौटा रहे हैं कि आइटम स्ट्रिंग नहीं है। उस स्थिति में, फ़ंक्शन अपरिभाषित लौटता है, जो आप परिणाम में देख रहे हैं।

मैप फ़ंक्शन का उपयोग एक मान से दूसरे में मैप करने के लिए किया जाता है, लेकिन ऐसा लगता है कि आप वास्तव में सरणी को फ़िल्टर करना चाहते हैं, जो कि मानचित्र फ़ंक्शन के लिए उपयुक्त नहीं है।

आप वास्तव में क्या चाहते हैं एक फिल्टर फ़ंक्शन है। यह एक फ़ंक्शन लेता है जो कि आप परिणामी सरणी में आइटम चाहते हैं या नहीं, इसके आधार पर सही या गलत रिटर्न देता है।

var arr = ['a','b',1];
var results = arr.filter(function(item){
    return typeof item ==='string';  
});

2
आह ... मुझे नहीं पता था कि एक फिल्टर फ़ंक्शन था। धन्यवाद।
अक्षत जीवन शर्मा

यह काफी समझ में आता है। मैं .map'ing नहीं कर रहा था मैं .filter'ing ... तुम्हें कैसे पता चला ?! ओओ
थैंक्स

काफी तार्किक धन्यवाद @ इक्के
मलिक खलील

उत्तर खोजने के मेरे प्रयास को सहेज लिया। धन्यवाद।
सोफी झांग

22

फ़िल्टर इस विशिष्ट मामले के लिए काम करता है जहाँ आइटम संशोधित नहीं होते हैं। लेकिन कई मामलों में जब आप मानचित्र का उपयोग करते हैं तो आप पास की गई वस्तुओं में कुछ संशोधन करना चाहते हैं।

यदि वह आपका इरादा है, तो आप कम उपयोग कर सकते हैं :

var arr = ['a','b',1];
var results = arr.reduce((results, item) => {
    if (typeof item === 'string') results.push(modify(item)) // modify is a fictitious function that would apply some change to the items in the array
    return results
}, [])

1
धन्यवाद - के mapसाथ सरणियों में परिणाम undefinedfilterकेवल आइटम लौटाता है या नहीं। यह एकदम सही है
Zach Smith

15

चूंकि ES6 filter नुकीले तीर संकेतन (जैसे LINQ) का समर्थन करता है:

तो यह एक-लाइनर का पालन करने के लिए उबला हुआ हो सकता है।

['a','b',1].filter(item => typeof item ==='string');

10

मेरा समाधान नक्शे के बाद फ़िल्टर का उपयोग करना होगा।

यह हर जेएस डेटा प्रकार का समर्थन करना चाहिए।

उदाहरण:

const notUndefined = anyValue => typeof anyValue !== 'undefined'    
const noUndefinedList = someList
          .map(// mapping condition)
          .filter(notUndefined); // by doing this, 
                      //you can ensure what's returned is not undefined

8

आप केवल एक मान लौटाते हैं यदि वर्तमान तत्व ए है string। शायद खाली स्ट्रिंग सौंपना अन्यथा पर्याप्त होगा:

var arr = ['a','b',1];
var results = arr.map(function(item){
    return (typeof item ==='string') ? item : '';  
});

बेशक, यदि आप किसी भी गैर-स्ट्रिंग तत्वों को फ़िल्टर करना चाहते हैं, तो आपको उपयोग नहीं करना चाहिए map()। बल्कि, आपको filter()फ़ंक्शन का उपयोग करना चाहिए ।


3
अगर कोई संख्या मौजूद है तो यह एक खाली स्ट्रिंग लौटाता है
प्रसाथ के


2

आप नीचे दिए गए तर्क की तरह लागू कर सकते हैं। मान लीजिए कि आप मूल्यों की एक सरणी चाहते हैं।

let test = [ {name:'test',lastname:'kumar',age:30},
             {name:'test',lastname:'kumar',age:30},
             {name:'test3',lastname:'kumar',age:47},
             {name:'test',lastname:'kumar',age:28},
             {name:'test4',lastname:'kumar',age:30},
             {name:'test',lastname:'kumar',age:29}]

let result1 = test.map(element => 
              { 
                 if (element.age === 30) 
                 {
                    return element.lastname;
                 }
              }).filter(notUndefined => notUndefined !== undefined);

output : ['kumar','kumar','kumar']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.