2011-08-27 28 views
6

Tôi đang xây dựng một autosuggest cho tên. Khi người dùng nhập vào hộp văn bản, nó gõ vào máy chủ và chạy điều này:Làm cách nào để kết hợp văn bản này nhanh hơn?

var names = [ list of 1000 names ]; //I have a list of 1000 names, this is static. 
var query = 'alex'; 
var matched_names = []; 

//This is when it gets slow.... 
names.forEach(function(name){ 
    if(name.indexOf(query) >= 0){ 
     matched_names.push(name); 
    } 
}); 

return matched_names; 

Làm cách nào để làm điều này nhanh hơn? Tôi đang sử dụng Node.js

+0

lưu ý rằng mã của bạn là trường hợp nhạy cảm: 'alex' sẽ không phù hợp với 'Alex', điều này có thể là những gì bạn muốn, mặc dù. – magma

Trả lời

7

Nếu tên là tĩnh thì hãy di chuyển mã này đến ứng dụng khách và chạy mã đó ở đó. Lý do duy nhất để chạy mã như thế này trên máy chủ là nếu nguồn dữ liệu động theo một cách nào đó.

Thực hiện logic phía máy khách này sẽ cải thiện đáng kể hiệu suất.

1

Bạn có lẽ nên sử dụng filter thay vào đó, cho một điều, bởi vì nó có nguồn gốc:

var names = [ /* list of 1000 names */ ]; 
var query = 'alex'; 
var matched_names = names.filter(function(name) { 
    return name.indexOf(query) > -1; 
}); 
return matched_names; 
1

Nếu bạn lưu trữ các tên trong thứ tự sắp xếp, sau đó bạn có thể sử dụng tìm kiếm nhị phân để tìm vùng tên trong sắp xếp thứ tự bắt đầu với đoạn tên mà người dùng đã gõ cho đến nay, thay vì kiểm tra tất cả các tên từng cái một.

Trên hệ thống có ngôn ngữ lập trình khá kỳ lạ, nơi tôi muốn tìm tất cả các kết quả phù hợp có chứa những gì người dùng đã nhập ở bất kỳ vị trí nào, tôi nhận được kết quả khả quan cho nỗ lực thực hiện không nhiều bằng cách khôi phục http://en.wikipedia.org/wiki/Key_Word_in_Context. (Khi ở trường đại học, tôi đã tìm kiếm thông qua một chỉ số KWIC thực, được in ra từ một nhà cung cấp IBM, và sau đó bị ràng buộc làm tài liệu cho mục đích này.

1

Tôi khuyên bạn nên làm điều này ở phía máy khách và thích (cho bây giờ) một thời gian vòng lặp thay vì một phương pháp lọc/foreach:

var names = [ /* list of 1000 names */ ] 
, query = 'alex' 
, i = names.length 
, matched_names = []; 

while(i--){ 
    if(names[i].indexOf(query) > -1){ 
    matched_names.push(names[i]); 
    } 
} 

return matched_names; 

này sẽ nhanh hơn nhiều (thậm chí nếu bộ lọc/foreach được hỗ trợ natively) Xem điểm chuẩn này:. http://jsperf.com/function-loops/4

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