Tại sao hàm bản đồ javascript trả về không xác định?


114

Mã của tôi

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

Điều này cho kết quả sau

["a","b",undefined]

Tôi không muốn không xác định trong mảng kết quả. Làm thế nào tôi có thể làm điều đó?


3
Bởi vì bạn không trả về bất cứ thứ gì trừ khi nó là một chuỗi. Do đó, mặt hàng cuối cùng trở lại undefined. Bạn mong đợi gì để trả về nếu nó không phải là một chuỗi? Một chuỗi trống?
BenM

2
@BenM nếu nó không phải là một chuỗi, tôi không muốn trả về gì cả. Thậm chí không phải là không xác định.
Akshat Jiwan Sharma

4
Có vẻ như tôi đã sử dụng sai phương pháp để thực hiện việc này. Tôi sẽ sử dụng bộ lọc theo đề xuất.
Akshat Jiwan Sharma

Bạn có thể muốn chấp nhận một câu trả lời.
Ikke

3
jQuery.map thực sự đủ thông minh để không bao gồm các giá trị không xác định và null trong mảng kết quả.
Donald Taylor,

Câu trả lời:


179

Bạn sẽ không trả lại bất kỳ thứ gì trong trường hợp mục đó không phải là một chuỗi. Trong trường hợp đó, hàm trả về không xác định, những gì bạn đang thấy trong kết quả.

Hàm bản đồ được sử dụng để ánh xạ giá trị này sang giá trị khác, nhưng có vẻ như bạn thực sự muốn lọc mảng mà hàm bản đồ không phù hợp.

Những gì bạn thực sự muốn là một chức năng lọc . Nó nhận một hàm trả về true hoặc false dựa trên việc bạn có muốn mục đó trong mảng kết quả hay không.

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

2
Ahh ... Tôi không biết có chức năng lọc. Cảm ơn.
Akshat Jiwan Sharma

Điều này có một chút ý nghĩa. Tôi không phải .map'ing Tôi là .filter'ing ... Làm sao bạn biết ?! Oo Cảm ơn ^. ^
DigitalDesignDj

khá hợp lý Cảm ơn @Ikke
Malik Khalil

Tiết kiệm nỗ lực của tôi để tìm kiếm câu trả lời. Cảm ơn.
Sophie Zhang

22

Bộ lọc hoạt động cho trường hợp cụ thể này khi các mục không được sửa đổi. Nhưng trong nhiều trường hợp khi bạn sử dụng bản đồ, bạn muốn thực hiện một số sửa đổi đối với các mục được chuyển.

nếu đó là mục đích của bạn, bạn có thể sử dụng giảm :

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
Cảm ơn - mapkết quả trong mảng với undefined. filterchỉ trả lại hàng hoặc không. điều này thật hoàn hảo
Zach Smith

15

Vì ES6 filterhỗ trợ ký hiệu mũi tên nhọn (như LINQ):

Vì vậy, nó có thể được đun sôi để làm theo một lớp lót.

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

10

Giải pháp của tôi là sử dụng bộ lọc sau bản đồ.

Điều này sẽ hỗ trợ mọi kiểu dữ liệu JS.

thí dụ:

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

Bạn chỉ trả về một giá trị nếu phần tử hiện tại là a string. Có lẽ chỉ định một chuỗi rỗng nếu không sẽ đủ:

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

Tất nhiên, nếu bạn muốn lọc bất kỳ phần tử không phải chuỗi nào, bạn không nên sử dụng map(). Thay vào đó, bạn nên xem xét việc sử dụng filter()hàm.


3
Này trả về một chuỗi rỗng nếu có tồn tại một số
Prasath K

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

3

Bạn có thể triển khai như một logic dưới đây. Giả sử bạn muốn một mảng giá trị.

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']
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.