2011-11-10 22 views
5

Aquí es lo que tengo¿Cómo crear propiedades de objeto JavaScript dinámicamente con nombre?

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

usando jQuery/Javascript Quiero construir una matriz de objetos con pares de nombre y valor que tiene este aspecto:

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

He intentado esto sin éxito:

var output = new Array(); 
$('.grab').each(function(index) { 
    output.push({$(this).attr('name'): $(this).val()}); 
}); 

He intentado varias variaciones, incluida la experimentación con eval(), pero fue en vano. Si elimino $ (this) .attr ('name'), y le doy un nombre estático, funciona ... entonces, ¿cómo puedo crear objetos dinámicamente con nombre?

Respuesta

16

La sintaxis de objeto literal no puede utilizarse para claves que no sean literales. Para usar una clave no literal con un objeto, se requiere la notación object[keyExpression], como se muestra a continuación. (Esto es equivalente a object.key cuando keyExpression = "key", pero tenga en cuenta el primer caso lleva a una expresión como la clave y el segundo identificador.)

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

feliz codificación.


También, considere el uso de .map():

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

Gracias, eso funcionó. Gracias por la respuesta rápida y la buena información. – user988300

+0

@pst - ¡bonito, gracias! aprendí algo nuevo ... – xgencoder

+0

gracias por la gran utilidad :) – ProllyGeek

0

Me tomó sólo el ID de la forma como un parámetro de esta función:

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

El objeto resultado es algo como esto Object { fieldname="value", fieldname1="value1", fieldname2="value3", ...}

Cuestiones relacionadas