2011-11-10 13 views
5

Ecco quello che hoCome creare proprietà di oggetti JavaScript con nomi dinamici?

<form> 
    <input type="text" name="item1" class="grab" value="userInput" /> 
    <input type="text" name="somethingelse1" class="grab" value="differentUserInput" /> 
    ... (any number of inputs) 
</form> 

utilizzando jQuery/Javascript voglio costruire un array di oggetti con coppie di valori nome che assomiglia a questo:

output = [ {item1: userInput}, {somethingelse1: differentUserInput} ... etc.]; 

Ho provato questo senza successo:

Ho provato diverse varianti tra cui la sperimentazione con eval(), ma senza successo. Se rimuovo $ (this) .attr ('nome'), e gli do un nome statico funziona ... quindi come posso creare oggetti con nome dinamico?

risposta

16

La sintassi dell'oggetto letterale non può essere utilizzata per chiavi non letterali. Per utilizzare una chiave non letterale con un oggetto è necessaria la notazione object[keyExpression], come indicato di seguito. (Ciò equivale a object.key quando keyExpression = "key", ma è da notare il primo caso prende un espressione come la chiave e il secondo un identificatore.)

var output = [] 
$('.grab').each(function(index) { 
    var obj = {} 
    obj[$(this).attr('name')] = $(this).val() 
    output.push(obj) 
}) 

Felice di codifica.


Inoltre, considerare l'utilizzo di .map():

var output = $('.grab').map(function() { 
    var obj = {} 
    obj[$(this).attr('name')] = $(this).val() 
    return obj 
}) 
+0

Grazie, ha funzionato. Grazie per la rapida risposta e le buone informazioni. – user988300

+0

@ pst - abbastanza pulito, grazie! imparato qualcosa di nuovo ... – xgencoder

+0

grazie per la grande utilità :) – ProllyGeek

0

ho preso solo l'id della forma come un parametro di questa funzione:

function form2JSON(form){ 
    var info_ser = $('#'+form).serialize(); 
    var data = info_ser.split('&'); 
    var output = {}; 
    $.each(data, function(i, l){ 
     var data_input = l.split('='); 
     output[data_input[0]] = data_input[1]; 
    }); 
    return output; 
} 

L'oggetto risultato è qualcosa di simile Object { fieldname="value", fieldname1="value1", fieldname2="value3", ...}

Problemi correlati