2012-07-02 13 views
15

tengo una matriz que es:¿Cómo buscar en una matriz en Node.js sin bloqueo?

[ 4ff023908ed2842c1265d9e4, 4ff0d75c8ed2842c1266099b ] 

Y tengo que encontrar si el siguiente, que está dentro de esa matriz

4ff0d75c8ed2842c1266099b 

Aquí es lo que escribí:

Array.prototype.contains = function(k) { 
    for(p in this) 
    if(this[p] === k) 
     return true; 
    return false; 
} 

parecer , no funciona correctamente, o mejor a veces funciona, pero me parece que bloquea. ¿Hay alguien que pueda verificar eso?

muchas gracias

+3

"bloqueo"? Además, no itere las matrices con 'for in'. De todos modos, solo escríbelo como 'this.indexOf (k)> -1' ... – Ryan

+0

¿Son estos objetos' ObjectId'? – JohnnyHK

+0

¿Cuál es su definición de bloqueo? En Nodo, generalmente significa "esperar a que termine la E/S". – Thilo

Respuesta

32

para no bloquear la función de búsqueda

Array.prototype.contains = function(k, callback) { 
    var self = this; 
    return (function check(i) { 
     if (i >= self.length) { 
      return callback(false); 
     } 

     if (self[i] === k) { 
      return callback(true); 
     } 

     return process.nextTick(check.bind(null, i+1)); 
    }(0)); 
} 

Uso:

[1, 2, 3, 4, 5].contains(3, function(found) { 
    if (found) { 
     console.log("Found"); 
    } else { 
     console.log("Not found"); 
    } 
}); 

Sin embargo, para buscar el valor de la matriz es mejor usar Javascript construido en serie función de búsqueda, ya que será mucho más rápido (para que probablemente no necesite que sea no bloqueante):

if ([1, 2, 3, 4, 5].indexOf(3) >= 0) { 
    console.log("Found"); 
} else { 
    console.log("Not found"); 
} 

Además, considere la biblioteca underscore que hace todas las cosas multiplataforma: http://underscorejs.org/

+2

node.js -> solo una plataforma. Siempre que no necesite ejecutar esto en el navegador, no necesita compatibilidad entre plataformas. – TheHippo

+1

Sin embargo, es mejor escribir código compatible con estándares multiplataforma, a menos que los costos sean demasiado altos. – penartur

+4

Creo que hay diferentes enfoques para esto. En aras del rendimiento, no escribo multiplataforma si no es necesario que se ejecute multiplataforma. – TheHippo