2012-05-23 8 views

Respuesta

0

Lo que estás haciendo es válido, pero tiene fallas.

if (opt && opt.key && opt.key2) { 

Esta comprobación fracasaría si opt.key tiene falsamente valores [0, null, falsa, y así sucesivamente]

En ese caso, tendría que hacer una verificación de typeof para asegurarse de que no es indefinido

if (opt && typeof opt.key !== "undefined" && opt.key2) { 
1

No realmente.

menos que se puede utilizar opt.pleaseReadMyMind() ;-)

Se puede crear un método que va a comprobar si todos los campos tienen valores diferentes a null, sin embargo.

+1

¿Hay algún tipo de característica como la reflexión en Javascript que podría hacer esto? – edocetirwi

+0

La reflexión se puede lograr así: 'for (var method in this) { if (typeof this [method] == 'function') {...}}' – abaelter

1

Esa es la manera más compacta de hacerlo.

La forma más correcta sería:

if(typeof opt !== "undefined" && typeof opt.key !== "undefined" && typeof opt.key2 !== "undefined") { 

Pero como se puede ver que es un buen bocado y no es realmente necesario.

0

Sí, pero es solo "mejor" si tiene muchas llaves para verificar, no solo tres. Algo como esto:

function opt(opt) { 
    for(var i = 0; i<3; i++) { 
     if(typeof opt["key"+((i > 0) ? "" : i + 1))] === "undefined") { 
      return; 
     } 
    } 

    // create object 
} 

Si no está definida opt todas sus claves serán demasiado, por lo que hay una comprobación implícita para eso también.

También puede definir los nombres de las variables que desea comprobar en la matriz, algo como esto:

var propsToCheck = ["key", "key1", "key2"]; 

function(opt) { 
    for(var i = 0, ii = propsToCheck.length; i<ii; i++) { 
     if(typeof opt[propsToCheck[i]] === "undefined") { 
      return; 
     } 

     // create object 
    } 
} 

No hay mucho de una solución mejor, pero sí permite escribir menos si usted está planeando en revisando más de tres o cuatro propiedades.

+0

¿Qué? Dudo que los atributos en realidad se llamen 'key1',' key2', 'key3' y así sucesivamente .. –

+0

@NiklasB .: Probablemente tengas razón, pero yo quería darle al OP algo más que un golpe rotundo" es imposible ". –

+0

Luego debe sugerir un método que realmente le permita a uno definir el nombre de los atributos en una matriz o algo. Esa es solo mi opinión personal, por supuesto. –

0

Siempre se puede hacerlo de esta manera:

function validate(o, args) { 
    if (typeof(o) == 'object' && args instanceof Array) { 
     for (var i = args.length - 1; i >= 0; --i) { 
      if (typeof(o[args[i]]) === 'undefined') return false; 
     } 
     return true; 
    } else { 
     return false; 
    } 
} 

function myFunction(obj) { 
    if (validate(obj, ['foo', 'bar'])) { 
     // Your code goes here. 
    } else { 
     // Object passed to the function did not validate. 
    } 
} 

Aquí es un violín para usted: http://jsfiddle.net/reL2g/

1

Sólo tiene que escribir una rutina simple prueba para verificar el objeto dado una lista de nombres de propiedades:

// usage: testProps(object to test, [list, of, property, names]) 
// returns true if object contains all properties 
function testProps(obj, props) 
{ 
    if (obj === null) 
    return false; 

    var i; 
    for (i=0; i<props.length; ++i) 
    { 
    if (!(props[i] in obj)) 
     return false; 
    } 
    return true; 
} 

Y luego en su función:

if (!testProps(obj, ['key', 'key2']) 
    return; 
Cuestiones relacionadas