2011-11-10 73 views
5

这里是我如何创建动态命名的JavaScript对象属性?

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

使用jQuery/JavaScript的我想建立与名称值对对象的数组,看起来像这样:

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

我都没有成功尝试这样做:

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

我尝试了几个变化,包括试验eval(),但无济于事。如果我删除$(this).attr('name'),并给它一个静态名称,它会起作用......那么我如何创建动态命名的对象?

回答

16

文字对象语法不能用于非文字键。 要在对象上使用非文字键,需要使用object[keyExpression]表示法,如下所示。 (这相当于object.keykeyExpression = "key",但请注意前者的情况下接受一个表达作为密钥和后者的标识符。)

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

编码愉快。


而且,考虑使用.map()

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

谢谢你,工作。感谢您的快速回复和良好的信息。 – user988300

+0

@pst - 非常整齐,谢谢!学到了新的东西... – xgencoder

+0

感谢伟大的实用工具:) – ProllyGeek

0

我只用了表单的id作为该函数的参数:

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

结果对象是这样的Object { fieldname="value", fieldname1="value1", fieldname2="value3", ...}