2013-04-16 31 views
56

Mã của tôiTại sao hàm bản đồ javascript trả về không xác định?

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

này cho kết quả như sau

["a","b",undefined] 

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

+3

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

+0

@BenM nếu nó không phải là một chuỗi Tôi muốn không có gì trả lại. Thậm chí không xác định. –

+3

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

Trả lời

105

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

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

Điều bạn thực sự muốn là hàm filter. Phải mất một hàm trả về true hoặc false dựa trên việc bạn 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'; 
}); 
+0

Ahh ... Tôi không biết có chức năng lọc.Thanks. –

+0

Điều này tạo ra một chút ý nghĩa. Tôi đã không .map'ing tôi đã .filter'ing ... Làm thế nào bạn biết? O.o Cảm ơn ^.^ – DigitalDesignDj

+0

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

8

Bạn chỉ trả về giá trị nếu phần tử hiện tại là string. Có lẽ gán một chuỗi rỗng nếu không thì 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ỳ yếu tố không theo chuỗi, bạn không nên sử dụng map(). Thay vào đó, bạn nên xem xét sử dụng hàm filter().

+1

Điều này trả về một chuỗi trống nếu có một số –

+3

Có, tôi biết điều đó ... – BenM

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

Kể từ ES6 filter hỗ trợ ký hiệu mũi tên nhọn (như LINQ):

Vì vậy, nó có thể được luộc xuống sau một lót.

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

Bộ lọc hoạt động cho trường hợp cụ thể này khi các mục không bị 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à ý định của bạn, bạn có thể sử dụng reduce:

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 
}, []) 
Các vấn đề liên quan