从jQuery .each循环创建关联数组

时间:2015-03-08 00:52:53

标签: jquery

表行上的直接jQuery $.each循环。我对物体不太好,并且遇到了.push()方法的困难。

我应该得到:

[{"buyerPoINPUT":"1234567"},{"jobINPUT":"Replace grommit"},{"shipMethodINPUT":"etc"}]

相反,我得到了:

[{"t1":"1234567"},{"t1":"Replace grommit"},{"t1":"etc"}]

为什么我得到重复的t1变量名,而不是t1 var内容(id属性)?

jsFiddle

HTML:

    <div id="summaryTableDIV" class="b1">
        <table id="summaryTable">
            <thead>
                <th id="buyerPoTH">PO NO.</th><th id="jobTH">JOB</th><th id="shipMethodTH">SHIPPING<br>METHOD</th><th id="shipTermsTH">SHIPPING<br>TERMS</th><th id="payTermsTH">PAYMENT<br>TERMS</th><th id="blankTH"></th>
            </thead>
            <tbody>
                <td id="buyerPoTD"   ><input type="text" id="buyerPoINPUT"    value="1234567" /></td>
                <td id="jobTD"       ><input type="text" id="jobINPUT"        value="Replace grommit" /></td>
                <td id="shipMethodTD"><input type="text" id="shipMethodINPUT" value="Loomis or DHL" /></td>
                <td id="shipTermsTD" ><input type="text" id="shipTermsINPUT"  value="FOB Washington" /></td>
                <td id="payTermsTD"  ><input type="text" id="shipMethodINPUT" value="see below" /></td>
                <td id="blankTD"     ><input type="text" id="blankINPUT" value="Okay to proceed" /></td>
            </tbody>
        </table>
    </div><!-- #summaryTableDIV -->

JS / JQ:

var objSumTbl = new Array();

$("#summaryTable > tbody > tr > td > input").each(function(){
    var thisTD = $(this);
    var t1 = thisTD.attr('id');
    var t2 = thisTD.val();
    objSumTbl.push({
        t1 : t2
    });
});
alert( JSON.stringify(objSumTbl) ); 

3 个答案:

答案 0 :(得分:2)

事实证明,在JavaScript中定义对象并不会将键/值对的关键部分解释为变量。这实际上是命名属性t1而不是t1变量的值。

然而, 可以单独创建对象,并使用该变量引用对象上的属性来定义该属性。像这样:

var objSumTbl = new Array();

$("#summaryTable > tbody > tr > td > input").each(function(){
    var thisTD = $(this);
    var t1 = thisTD.attr('id');
    var t2 = thisTD.val();
    var newObj = {};
    newObj[t1] = t2;
    objSumTbl.push(newObj);
});
alert( JSON.stringify(objSumTbl) );

答案 1 :(得分:2)

当您使用对象表示法作为{key:value},&#39; key&#39;将始终被视为字符串常量而不是变量名称,您需要使用object [key_name_var]表示法。

这应该有效:

var thisTD = $(this);
var t1 = thisTD.attr('id');
var t2 = thisTD.val();
var new_obj = {};
new_obj[t1] = t2;
objSumTbl.push(new_obj);

更新:根据我们在评论中的讨论,您希望的结果应如下所示:

{"buyerPoINPUT":"1234567","jobINPUT":"Replace grommit","shipMethodINPUT":"etc"}

然后你应该将objSumTbl定义为一个对象,并使用[key]表示法来设置循环内的值:

var objSumTbl = {};

$("#summaryTable > tbody > tr > td > input").each(function(){
    var thisTD = $(this);
    var t1 = thisTD.attr('id');
    var t2 = thisTD.val();
    objSumTbl[t1] = t2;
});
alert( JSON.stringify(objSumTbl) ); 

要遍历对象内的所有值,请使用

Object.keys(objSumTbl)

获取objSumTbl中所有键的数组,然后对该数组执行for循环:

var keys = Object.keys(objSumTbl);
for(i=0;i<keys.length;i++){
    console.log(objSumTbl[ keys[i] ]);
}

答案 2 :(得分:1)

那不是你如何制作一个对象属性变量

尝试这种方式:

var objSumTbl = new Array();
$("#summaryTable > tbody > tr > td > input").each(function(){
    var thisTD = $(this);
    var t1 = thisTD.attr('id');
    var t2 = thisTD.val();
    var obj = {};
    obj[t1] = t2;
    objSumTbl.push(obj);
});

alert( JSON.stringify(objSumTbl) );