2015-01-09 26 views
6

tôi có một trang web nếu có gì đó được nhập vào hộp tìm kiếm, sau đó lặp lại thông qua một tệp cho giá trị đó, tôi cần nó để tìm kiếm/tìm thấy không phân biệt chữ hoa chữ thường . Các trường hợp nhạy cảm phải ở lại trong tập tin nhưng đối với mục đích so sánh nó bỏ qua các trường hợp. nên hiện tôi đang sử dụng lệnh gạch:cách sử dụng _.where() dưới dấu gạch dưới để so sánh các giá trị bất kể trường hợp

arr=_.where(arr,filter); 

nhưng 2 mảng arrfilter - tôi cần họ được so sánh/sử dụng bất kể trường hợp như vậy kết quả cuối cùng arr chứa kết quả mà sẽ hỗn hợp của chữ hoa và chữ nhưng đối sánh (các) giá trị trong arr. ai đó có thể giúp bạn không?

+1

Tại sao không chuyển sang vụ án đó với chức năng lọc? –

Trả lời

1

Thật không may, JS là không lớn khi nói đến quốc tế hóa case-insensitive so sánh chuỗi. Nếu bạn chỉ cần gắn bó với ASCII Mặc dù vậy, giải pháp là khá đơn giản (sử dụng filter tuy nhiên, không where):

function getMatches(query, arr) { 
    var lowerQuery = query.toLowerCase(); 
    return _.filter(arr, function(term) { 
    return term.toLowerCase() == lowerQuery; 
    }); 
} 

Hoặc nếu bạn muốn precompute tất cả mọi thứ vì bạn mong đợi để kiếm được nhiều thắc mắc trong cùng một Phiên JS:

var index = _.groupBy(arr, function(term) { return term.toLowerCase(); }); 

// Post-process index to reduce memory footprint by turning redundant values to nulls 
// (which take up less memory than arrays with a string in them). 
index = _.object(_.map(index, function(terms, key) { 
    return [key, (terms.length == 1 && terms[0].toLowerCase() == terms[0] ? null : terms)]; 
})); 

function getMatches(query) { 
    var lowerQuery = query.toLowerCase(); 
    return (lowerQuery in index ? index[lowerQuery] || lowerQuery : []); 
} 

Phương thức thứ hai và tối thiểu lưu trữ dữ liệu do bước hậu xử lý.

Here's a JSFiddle for both

2

Hãy thử sử dụng filter thay vì:

var filter = ["Apple", "bANAna", "orange"]; 
 
var arr = ["apPle", "ORANGE"]; 
 

 
// make filter lower case once  
 
var filterLower = _.invoke(filter, "toLowerCase"); 
 

 
var arr2 = _.filter(arr, function(v) { 
 
    // make entry lower case and see if it is in filterLower 
 
    return _.contains(filterLower, v.toLowerCase()); 
 
}); 
 

 
console.dir(arr2);
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"></script>

+0

Mặc dù có thể có hiệu suất cao hơn nếu bạn thực hiện nhiều truy vấn (chỉ có các lệnh 'n + q'' toLowerCase' thay vì 'n * q' với giải pháp của tôi, trong đó' n' là số lượng từ và 'q' là số lượng truy vấn), cần lưu ý rằng giải pháp này yêu cầu gấp đôi bộ nhớ, có thể có vấn đề nếu danh sách thuật ngữ dài. Ngoài ra, Rhumborl, sửa đổi nhỏ nhưng tôi nghĩ rằng OP chỉ cố gắng tìm kiếm 1 truy vấn tại một thời điểm. Tôi nghĩ rằng họ misspoke với gọi 'lọc' một mảng. – 0x24a537r9

+0

Ngoài ra, tôi nghĩ rằng điều này sẽ có hiệu suất cao hơn (thời gian tra cứu liên tục) bằng cách sử dụng một 'đối tượng' với các thuật ngữ chữ thường như các phím trỏ tới mảng của chuỗi gốc mà chúng tham chiếu. Bạn cũng có thể tối ưu hóa các yêu cầu về không gian bằng cách thay thế các mảng giá trị cho các từ đơn, đã viết thường thành một loại nhỏ gọn hơn như 'true' và chỉ biết cách diễn giải điều đó. – 0x24a537r9

Các vấn đề liên quan