2011-11-24 9 views
11

Tengo el siguiente objetohallazgo clave de objeto en underscore.js

{ join: {} } 

me gustaría encontrar que es objeto por defecto de la matriz a continuación

[ 
    { login: { label: 'Login', url: '#login' } }, 
    { join: { label: 'Join', url: '#join', theme: 'a' } }, 
    { home: { label: 'none', icon: 'home', url: '#', theme: 'a' } } 
] 

me gustaría recorrer la matriz y hacer coincidir la clave, en este caso 'join'.

Esto es lo que tengo hasta ahora:

var butt_to_find = { join: {} } 
var all_buttons = 'array above' 
var matching = _.find(all_buttons, function(default_button){ 
return if default_butt key @ 1 is the same as butt_to_find key @ 1; 
    }); 

Esta es la primera vez que he utilizado subrayado después de haber oído mucho sobre él. Cualquier ayuda, más que bienvenido

+3

Una menor (fuera del tema) punto: Estás usando 'label: 'none''. Seguramente 'label: null' (u omitir la propiedad' label') sería una manera más precisa de representar esto? Tal como está escrito, esperaría que la palabra "ninguna" realmente se represente en la interfaz de usuario. – davidchambers

+0

Buen puntero - gracias – Chin

Respuesta

19
var buttons = [ 
    { login: { label: 'Login', url: '#login' } }, 
    { join: { label: 'Join', url: '#join', theme: 'a' } }, 
    { home: { label: 'none', icon: 'home', url: '#', theme: 'a' } } 
] 

_.find(buttons, function (button) { return 'join' in button }) 

El problema es que usted está utilizando una estructura de datos subóptima. Esto tendría más sentido y produciría un código más simple:

var buttons = { 
    login: {label: 'Login', url: '#login'}, 
    join: {label: 'Join', url: '#join', theme: 'a'}, 
    home: {label: 'none', icon: 'home', url: '#', theme: 'a'} 
} 

buttons.join // equivalent to the `_.find` line in the first example (but much simpler) 

Quizás esté usando una matriz porque el orden de los botones es importante. En este caso, que haría uso de una matriz de matrices:

var buttons = [ 
    ['login', {label: 'Login', url: '#login'}], 
    ['join', {label: 'Join', url: '#join', theme: 'a'}], 
    ['home', {label: 'none', icon: 'home', url: '#', theme: 'a'}] 
] 

_.find(buttons, function (button) { return button[0] === 'join' }) 
+1

Gracias por los consejos - me hizo pensar en la estructura de datos que realmente me ayudó. – Chin

+11

FWIW (y un poco fuera de tema) pero no usaría una matriz de matrices para mantener el orden. Utilice una matriz de teclas para ordenar y mantenga los botones objeto tal como están. var botones = {...}; var buttonsOrder = ['login', 'join', 'home']; De esta manera, solo tiene que iterar las matrices cuando necesite un pedido, y puede hacer búsquedas inmediatas cuando necesite el artículo. – webnesto

4
var matching = 
(_.find 
    (all_buttons, 
    function (button) 
    { return _.keys(butt_to_find)[0] in button; 
    } 
) 
); 

donde _.keys(butt_to_find) evalúa a ['join'] (una matriz que contiene las claves de butt_to_find), _.keys(butt_to_find)[0] evalúa a 'join' (el primer elemento de dicha matriz), y _.keys(butt_to_find)[0] in button evalúa a cualquiera de true o false , dependiendo de si button contiene 'join' como clave. (The in operator es un operador de JavaScript regular, no es algo añadido por underscore.js.)

+0

muy apreciado gracias por este – Chin

1
var def = {join: {}} 
var defs = [ 
    { login: { label: 'Login', url: '#login' } }, 
    { join: { label: 'Join', url: '#join', theme: 'a' } }, 
    { home: { label: 'none', icon: 'home', url: '#', theme: 'a' } } 
] 
_.find(defs,function(item,key){ 
    return _.has(item,_.keys(def)[0]) 
}) 

Usted también puede conmutar a la biblioteca lodash (una caída en la versión de guión bajo) y hacer esto

_.compact(_.pluck(defs,_.keys(def)[0]))