2011-08-27 22 views
6

Estoy creando un autosugestor de nombres. Cuando el usuario escribe en el cuadro de texto, que pegó en el servidor y se ejecuta esto:¿Cómo puedo unir este texto más rápido?

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; 

¿Cómo puedo hacer esto más rápido? Estoy usando Node.js

+0

nota de que el código es mayúsculas y minúsculas: 'alex' no coincidirá con 'Alex'; sin embargo, esto podría ser lo que quieras. – magma

Respuesta

7

Si los nombres son estáticas luego pasar este código para el cliente y ejecutarlo allí. La única razón para ejecutar código como este en el servidor es si la fuente de datos es dinámica de alguna manera.

Hacer esto del lado del cliente lógica mejorará considerablemente el rendimiento.

1

Probablemente debería utilizar filter lugar, por un lado, porque es nativa:

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

Si almacena los nombres en orden clasificado, a continuación, puede utilizar la búsqueda binaria para encontrar la región de los nombres dentro de la ordenada orden que comienza con el fragmento de nombre que el usuario ha tipeado hasta el momento, en lugar de verificar todos los nombres uno por uno.

En un sistema con un lenguaje de programación bastante extraño, donde quería encontrar todos los partidos que contienen lo que el usuario había escrito hasta ahora en cualquier posición, me dieron un resultado satisfactorio por no mucho esfuerzo de implementación mediante la reactivación de http://en.wikipedia.org/wiki/Key_Word_in_Context. (Una vez en la universidad busqué en un índice KWIC físico, impreso desde una impresora de línea de IBM, y luego encuadernado como un documento solo para este propósito.

1

Le sugiero que haga estas cosas por el lado del cliente y prefiera (por ahora) un bucle while en lugar de un enfoque de filtro/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; 

esto será mucho más rápido (incluso si el filtro/forEach están soportados de forma nativa) Ver este punto de referencia:. http://jsperf.com/function-loops/4

Cuestiones relacionadas