2012-07-28 13 views
7

que tienen un objeto de esta manera:Cómo usar el filtro Underscore.js con un objeto?

> Object 
    > [email protected]: Array[100] 
    > [email protected]: Array[4] 
    > 0 
     id : 132 
     selected : true 
    > 1 
     id : 51 
     selected : false 

etc ..

¿Cómo puedo utilizar el subrayado _.filter() para volver sólo los elementos seleccionados, donde === verdad?

Nunca he tenido la necesidad de bajar a las capas con _.filter(). Algo así como

var stuff = _.filter(me.collections, function(item) { 
    return item[0].selected === true; 
}); 

Gracias

+0

Podría aclarar el formato de objeto? ¿Parece un hash de matrices codificadas para direcciones de correo electrónico? – rjz

+0

eso es correcto, ¿cómo puedo aclararlo? – AnApprentice

+0

¿Y está tratando de sacar elementos del hash donde * todos * los elementos de la matriz tienen 'selected == true'? – rjz

Respuesta

8

Si desea extraer todos los elementos de la matriz desde cualquier dirección de correo electrónico donde selected es true, se puede repetir este modo:

var selected = []; 

for (email in emailLists) { 
    selected.concat(_.filter(emailLists[email], function (item) { 
     return item.selected === true; 
    })); 
} 

Si sólo desea extraer las matrices donde todos los elementos son selected, en su lugar puede hacer algo como esto:

var stuff = _.filter(me.collections, function(item) { 
    return _.all(item, function (jtem) { 
     jtem.selected === true; 
    }); 
}); 
+0

Gracias, para la primera respuesta, ¿qué es "correo electrónico en obj? "y" obj [email] "el objeto que tengo se llama" emailLists "dado que, ¿puedes actualizar? thx – AnApprentice

+0

extraño, estoy obteniendo un "identificador SyntaxError no detectado: inesperado" – AnApprentice

+0

Sure.'obj' debería haber sido' emailLists'; 'email' es solo la clave de cada elemento en el objeto. ¿Dónde está ese error? (¡No hice la prueba!): ^) – rjz

1

Tengo un objeto llamado allFilterValues ​​que contengan la siguiente:

{"originDivision":"GFC","originSubdivision":"","destinationDivision":"","destinationSubdivision":""} 

Ésta es feo, pero que pidió un guión bajo forma basada en filtrar un objeto. Así es como devolví solo los elementos de filtro que tenían valores no falsos; puede cambiar la instrucción de retorno del filtro a lo que usted necesita:

var nonEmptyFilters = _.pick.apply({}, [allFilterValues].concat(_.filter(_.keys(allFilterValues), function(key) { 
     return allFilterValues[key]; 
    }))); 

salida (JSON/stringified):

{"originDivision":"GFC"} 
4

método de filtro de Subrayado funcionará en un objeto que se utiliza como un hash o diccionario , pero devolverá una matriz de los valores enumerables del objeto y quitará las claves. Necesitaba una función para filtrar un hash por sus valores que preservaría las teclas, y escribí esto en CoffeeScript:

hash_filter: (hash, test_function) -> 
    keys = Object.keys hash 

    filtered = {} 
    for key in keys 
    filtered[key] = hash[key] if test_function hash[key] 
    filtered 

Si no se está usando CoffeeScript, aquí está el resultado compilado en Javascript, limpiado un poco:

hash_filter = function(hash, test_function) { 
    var filtered, key, keys, i; 
    keys = Object.keys(hash); 
    filtered = {}; 
    for (i = 0; i < keys.length; i++) { 
    key = keys[i]; 
    if (test_function(hash[key])) { 
     filtered[key] = hash[key]; 
    } 
    } 
    return filtered; 
} 


hash = {a: 1, b: 2, c: 3}; 
console.log((hash_filter(hash, function(item){return item > 1;}))); 
// Object {b=2, c=3} 

TL; DR: Object.keys() es genial!

+0

Agregué la clave como un segundo parámetro, como lo hace Underscore '_.filter()'. Espero que sea genial! :) –

-1

Tal vez desea una forma más simple

_.filter(me.collections, { selected: true}) 
Cuestiones relacionadas