2013-06-16 9 views
5

Ho un oggetto jQuery obj che incapsula un insieme di elementi di input.

Sto usando questo codice per fare una serie di valore di ciascun elemento:

$.map(obj, function(elem, i){ 
    return $(elem).val(); 
}); 

Il problema è che a volte alcuni dei campi di input contengono valori non validi e desidero saltarli nel processo di creazione della matrice. Fare un semplice return false non sembra saltare l'elemento, ma inserisce uno false nella matrice.

Vorrei sapere se esiste un modo per farlo effettivamente senza utilizzando .each esplicitamente.

risposta

11

Poiché è una raccolta jQuery, è possibile eseguire direttamente .map e quindi utilizzare .get in modo che diventi una matrice.

var values = obj.map(function(){ 
    return this.value ? this.value : null; 
}).get(); 

Nota: Il controllo di cui sopra restituirà qualsiasi valore che non sia Falsey.

Vedere test case on jsFiddle.

+1

Potremmo farlo in questo modo anche 'var myArray = ['one', 'two', 'three']; var i = myArray.filter (function (n) { return n }); "Posso sapere che hai usato' get'? – wuhcwdc

+0

@PankajGarg Se si dispone di un array per iniziare, sicuro. In questo caso l'OP ha una collezione jQuery e desidera un array con valori validi. Usando '.map' in congiunzione con' .get', prima mapperemo la nostra collezione jQuery e poi la convertiremo in una matrice. Si noti che '.filter' e' .map' di jQuery funzionano in modo diverso rispetto ai metodi simili nell'oggetto 'Array' nativo. – mekwall

4

Avrei dovuto provare a non restituire nulla (nulla) che ha fatto il trucco, non so perché questo non mi è passato per la testa prima.

Nel caso in cui si vuole fare lo stesso, qui è la correzione:

$.map(obj, function(elem, i){ 
    if($(elem).val().length == 0) return; 

    return $(elem).val(); 
}); 

EDIT

Ho appena testato la lunghezza qui e omesso per il codice di convalida per rimanere sulla stessa oggetto

+0

Questo sembra non corretto, C'è una differenza tra ** valori non validi ** e vuoto/nulla? – wuhcwdc

+0

Suggerisco che 'return;' ottiene 'undefined'. Cioè, i risultati non sono definiti, piuttosto che restituire specificamente "indefinito". Ciò fa sì che l'elemento non venga inserito nell'array. Tuttavia, non posso sostenerlo senza ricerche (o altri commenti). Lo stato di Mozilla che non definito è _returned_. Meglio non perseguire questo troppo lontano - penso che questa discussione abbia avuto luogo molte volte prima;) –

+0

@PankajGarg ho omesso l'intero codice di convalida di proposito solo per rimanere in tema ... –

Problemi correlati