เหตุใดฟังก์ชันแผนที่จาวาสคริปต์จึงส่งคืนไม่ได้กำหนด


116

รหัสของฉัน

 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 ถ้าไม่ใช่สตริงฉันไม่ต้องการอะไรคืนไม่ได้กำหนด
Akshat Jiwan Sharma

4
ดูเหมือนว่าฉันใช้ผิดวิธีในการทำสิ่งนี้ฉันจะใช้ตัวกรองตามที่แนะนำ
Akshat Jiwan Sharma

คุณอาจต้องการยอมรับคำตอบ
Ikke

3
jQuery.map นั้นฉลาดพอที่จะไม่รวมค่าที่ไม่ได้กำหนดและค่าว่างในอาร์เรย์ผลลัพธ์
Donald Taylor

คำตอบ:


181

คุณจะไม่ส่งคืนอะไรเลยในกรณีที่รายการนั้นไม่ใช่สตริง ในกรณีนี้ฟังก์ชันจะส่งคืนค่าที่ไม่ได้กำหนดสิ่งที่คุณเห็นในผลลัพธ์

ฟังก์ชันแผนที่ใช้เพื่อแมปค่าหนึ่งกับค่าอื่น แต่ดูเหมือนว่าคุณต้องการกรองอาร์เรย์ซึ่งฟังก์ชันแผนที่ไม่เหมาะ

สิ่งที่คุณต้องการคือฟังก์ชันตัวกรอง ใช้ฟังก์ชันที่ส่งคืนจริงหรือเท็จโดยขึ้นอยู่กับว่าคุณต้องการให้ไอเท็มอยู่ในอาร์เรย์ผลลัพธ์หรือไม่

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

2
อ่า ... ฉันไม่รู้ว่ามีฟังก์ชั่นตัวกรองขอบคุณ
Akshat Jiwan Sharma

สิ่งนี้ค่อนข้างสมเหตุสมผล ฉันไม่ใช่. map'ing ฉันเป็น. กรอง ... คุณรู้ได้อย่างไร?! Oo Thanks ^. ^
DigitalDesignDj

ค่อนข้างมีเหตุผลขอบคุณ @Ikke
Malik Khalil

ประหยัดความพยายามในการค้นหาคำตอบ ขอบคุณ.
Sophie Zhang

23

ตัวกรองใช้ได้กับกรณีเฉพาะนี้ที่ไม่มีการแก้ไขรายการ แต่ในหลาย ๆ กรณีเมื่อคุณใช้แผนที่คุณต้องการแก้ไขบางอย่างกับรายการที่ส่งผ่าน

หากนั่นคือเจตนาของคุณคุณสามารถใช้การลด :

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

วิธีแก้ปัญหาของฉันคือใช้ตัวกรองหลังแผนที่

สิ่งนี้ควรรองรับข้อมูล JS ทุกประเภท

ตัวอย่าง:

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
สิ่งนี้จะส่งคืนสตริงว่างหากมีตัวเลข
Prasath K


3

คุณสามารถใช้ตรรกะด้านล่าง สมมติว่าคุณต้องการอาร์เรย์ของค่า

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.