2012-05-23 7 views

risposta

0

Quello che stai facendo è valido, ma ha dei difetti.

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

Questo controllo fallirebbe se opt.key ha falsamente valori [0, null, false, e così via]

In questo caso si dovrà fare un controllo typeof per assicurarsi che non è non definito.

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

Non proprio.

A meno che non si può usare opt.pleaseReadMyMind() ;-)

Si potrebbe creare un metodo che controllare se tutti i campi hanno valori diversi a null, però.

+1

C'è qualche tipo di funzione come la riflessione in Javascript, che potrebbe fare questo? – edocetirwi

+0

La riflessione può essere ottenuta in questo modo: 'per (metodo var in questo) { if (tipo di questo [metodo] == 'funzione') {...}}' – abaelter

1

Questo è il modo più compatto per farlo.

Il modo più corretto sarebbe:

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

Ma, come si può vedere che è un bel sorso e non realmente necessari.

0

Sì, ma è solo "migliore" se hai un sacco di chiavi da controllare, non solo tre. Qualcosa di simile a questo:

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

    // create object 
} 

Se opt è indefinito tutte le sue chiavi saranno troppo, quindi non c'è un controllo implicito per quello.

Si potrebbe anche definire i nomi delle variabili che si desidera controllare in ordine, qualcosa di simile:

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 
    } 
} 

Non c'è molto di una soluzione migliore, ma permette per meno di battitura, se avete intenzione di controllando più di tre o quattro proprietà.

+0

Cosa? Dubito che gli attributi siano effettivamente chiamati 'key1',' key2', 'key3' e così via .. –

+0

@NiklasB .: Probabilmente hai ragione ma volevo dare all'OP qualcosa di diverso da un flat out" è impossibile ". –

+0

Quindi dovresti suggerire un metodo che in effetti consente di definire il nome degli attributi in una matrice o qualcosa del genere. Questa è solo la mia opinione personale, ovviamente. –

0

Si può sempre fare in questo modo:

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. 
    } 
} 

Ecco un violino per voi: http://jsfiddle.net/reL2g/

1

Basta scrivere una semplice routine di prova per verificare l'oggetto dato un elenco di nomi di proprietà:

// 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; 
} 

E poi nella vostra funzione:

if (!testProps(obj, ['key', 'key2']) 
    return; 
Problemi correlati