2012-08-06 10 views
7

Actualmente le regreso una respuesta JSON como esto ...Búsqueda de elementos en una matriz JSON El uso de Nodo (preferiblemente sin iteración)

{items:[ 
    {itemId:1,isRight:0}, 
    {itemId:2,isRight:1}, 
    {itemId:3,isRight:0} 
]} 

que desea llevar a cabo algo como esto (pseudo código)

var arrayFound = obj.items.Find({isRight:1}) 

esto entonces volver

[{itemId:2,isRight:1}] 

sé que puedo hacer esto con un bucle para cada uno, sin embargo, estoy tratando para evitar esto. Esto es actualmente del lado del servidor en una aplicación Node.JS.

+0

A menos que tenga más información, iteración es inevitable. ¿Pero por qué estás tratando de excluir eso de todos modos? – Zirak

+0

¿Qué quiere decir con "* * sin iteración"? ¿Cómo podría funcionar eso? – Bergi

+0

Supongo que quise decir sin el patrón de iteración de la tradición (un regular para cada ciclo) Pero estoy seguro de que es un uso creativo de la expresión regular y/o el mapeo que también podría usarse. – Jackie

Respuesta

19
var arrayFound = obj.items.filter(function(item) { 
    return item.isRight == 1; 
}); 

Por supuesto, también podría escribir una función para buscar elementos por un objeto literal como una condición:

Array.prototype.myFind = function(obj) { 
    return this.filter(function(item) { 
     for (var prop in obj) 
      if (!(prop in item) || obj[prop] !== item[prop]) 
       return false; 
     return true; 
    }); 
}; 
// then use: 
var arrayFound = obj.items.myFind({isRight:1}); 

Ambas funciones hacen uso de la native .filter() method en matrices.

+0

Lo divertido es que todavía utiliza iteración. No entiendo la intención del OP. – Zirak

3

Dado que Node implementa la especificación EcmaScript 5, puede usar Array#filter en obj.items.

2

editado para usar método nativo

var arrayFound = obj.items.filter(function() { 
    return this.isRight == 1; 
}); 
+2

Es poco probable que use jQuery en Node.js, e incluso si estuviera disponible, se debe usar el método de filtro nativo. – Bergi

+1

Sí, tienes razón. El método del filtro nativo se me olvidó – mathisonian

1

En realidad me pareció una manera aún más fácil si utiliza MongoDB a persistir documentos que ...

findDocumentsByJSON = function(json, db,docType,callback) { 
    this.getCollection(db,docType,function(error, collection) { 
    if(error) callback(error) 
    else { 
     collection.find(json).toArray(function(error, results) { 
     if(error) callback(error) 
     else 
      callback(null, results) 
     }); 
    } 
    }); 
} 

A continuación, puede pasar {Isright: 1 } al método y devuelve una matriz SÓLO de los objetos, lo que me permite empujar el pesado levantamiento hacia el mongo capaz.

0

usted podría intentar encontrar el resultado esperado está utilizando el find function, se puede ver el resultado en la siguiente secuencia de comandos:

var jsonItems = {items:[ 
 
    {itemId:1,isRight:0}, 
 
    {itemId:2,isRight:1}, 
 
    {itemId:3,isRight:0} 
 
]} 
 

 
var rta = jsonItems.items.find(
 
    (it) => { 
 
    return it.isRight === 1; 
 
    } 
 
); 
 

 
    
 
console.log("RTA: " + JSON.stringify(rta)); 
 

 
// RTA: {"itemId":2,"isRight":1}

Cuestiones relacionadas