জাভাস্ক্রিপ্ট মানচিত্রের ফাংশন কেন অপরিবর্তিত?


114

আমার কোড

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

এটি নিম্নলিখিত ফলাফল দেয়

["a","b",undefined]

আমি ফলাফল অ্যারেতে অপরিজ্ঞাত চাই না। আমি কীভাবে এটি করতে পারি?


3
কারণ আপনি যদি কোনও স্ট্রিং না করেন তবে কিছুই ফিরিয়ে দেন না। অতএব, শেষ আইটেমটি ফিরে আসে undefined। এটি স্ট্রিং না হলে আপনি কী প্রত্যাশা করবেন? একটি খালি স্ট্রিং?
বেনম

2
@ বেনম যদি এটি স্ট্রিং না হয় তবে আমি কিছুই ফিরিয়ে আনতে চাই না even এমনকি অপরিবর্তিতও নেই।
অক্ষত জিওয়ান শর্মা

4
দেখে মনে হচ্ছে এটি করার জন্য আমি ভুল পদ্ধতিটি ব্যবহার করছি suggested আমি প্রস্তাবিত ফিল্টারটি ব্যবহার করব।
অক্ষত জিওয়ান শর্মা

আপনি একটি উত্তর গ্রহণ করতে চাইতে পারেন।
ইক্কে

3
jQuery.map প্রকৃতপক্ষে যথেষ্ট স্মার্ট যার ফলে ফলাফলের অ্যারেতে অপরিজ্ঞাত ও নাল মান অন্তর্ভুক্ত করা যায় না।
ডোনাল্ড টেলর 14

উত্তর:


179

আইটেমটি স্ট্রিং নয় এমন ক্ষেত্রে আপনি কোনও কিছুই ফিরিয়ে দিচ্ছেন না। সেক্ষেত্রে ফাংশনটি অপরিজ্ঞাত করে দেয়, ফলাফলটিতে আপনি কী দেখছেন।

মানচিত্রের ফাংশনটি একটি মানকে অন্য মানচিত্রের জন্য ব্যবহার করা হয়, তবে দেখে মনে হচ্ছে আপনি আসলে অ্যারে ফিল্টার করতে চান যা মানচিত্রের জন্য উপযুক্ত নয়।

আপনি আসলে যা চান তা হ'ল একটি ফিল্টার ফাংশন। এটি ফলস্বরূপ লাগে যা আপনাকে ফলাফলের অ্যারেতে আইটেমটি চায় কিনা তার ভিত্তিতে সত্য বা মিথ্যা প্রত্যাবর্তন করে।

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

2
আহ ... আমি জানতাম না সেখানে একটি ফিল্টার ফাংশন রয়েছে। ধন্যবাদ।
অক্ষত জিওয়ান শর্মা

এটি বেশ কিছুটা অর্থবোধ করে। আমি ছিলাম না। ম্যাপ করাচ্ছিলাম আমি ফিল্টার করছি ... তুমি কীভাবে জানলে ?! ওও ধন্যবাদ ^। ^
ডিজিটাল ডিজাইনডিজে

বেশ যৌক্তিক ধন্যবাদ @ ইক্কে
মালিক খলিল

একটি উত্তর অনুসন্ধান করার জন্য আমার প্রচেষ্টা সংরক্ষণ করে। ধন্যবাদ।
সোফি ঝাং

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 স্মিথ

15

যেহেতু ES6 filterবিন্দুযুক্ত তীর চিহ্নকে সমর্থন করে (যেমন লিনকুই):

সুতরাং এটি ওয়ান-লাইনার অনুসরণ করে সিদ্ধ করা যেতে পারে।

['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']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.