jquery .each循环奇怪的行为

时间:2015-05-06 13:33:59

标签: javascript jquery each

您好我有以下代码
html

<table id="tbPermission">
  <tr>
    <th>User ID</th>
    <th>User Name</th>
  </tr>
  <tr>
    <td>1</td>
    <td>Test1</td>
  </tr>
<tr>
    <td>2</td>
    <td>Test2</td>
  </tr>
<tr>
    <td>3</td>
    <td>Test3</td>
  </tr>
</table>  

脚本

var trArray = [];
var tdArray = [];
var reruiredObj = {"UserID":null,
                   "UserName":null
                  };
var first;
var second;
$('#tbPermission tr').each(function () {

    $(this).find('td').each(function (index) {
        //alert(index+'-'+ $(this).html());
        //alert(index);
        if(index == 0){
            first = $(this).html();
        }
        else{
            second = $(this).html();

        }
        //alert(JSON.stringify(reruiredObj));
    });
    alert(first+'-'+second)
    reruiredObj['UserID'] = first;
    reruiredObj['UserName'] = second;
    trArray.push(reruiredObj);


});
alert(JSON.stringify(trArray));  

Demo Here
我的问题是firstsecondundefined中的第一次提醒,以及原因为何 [{"UserID":"3","UserName":"Test3"},{"UserID":"3","UserName":"Test3"},{"UserID":"3","UserName":"Test3"},{"UserID":"3","UserName":"Test3"}]
我想要的输出是
[{"UserID":"1","UserName":"Test1"},{"UserID":"2","UserName":"Test2"},{"UserID":"3","UserName":"Test3"}]

3 个答案:

答案 0 :(得分:2)

reruiredObj对象的范围不正确,这就是为什么你得到同一个对象三次。试试这个:

var trArray = [];
var tdArray = [];
var first;
var second;
$('#tbPermission tr:gt(0)').each(function () {
    var reruiredObj = {
        "UserID": null,
            "UserName": null
    };
    first = $(this).find('td').eq(0).html();
    second = $(this).find('td').eq(1).html();
    reruiredObj['UserID'] = first;
    reruiredObj['UserName'] = second;
    trArray.push(reruiredObj);
});
console.log(JSON.stringify(trArray));

<强> jsFiddle example

未定义的值来自迭代你不想要的第一行,可以忽略tr:gt(0)

答案 1 :(得分:1)

第一个警报给出了undefined,因为表的第一行不包含任何td元素。

要从循环中排除第一行:

$('#tbPermission tr').each(function (i) {    
  if (i != 0) {    
    // execute ..
  }
});

对于数组,请在每个循环中尝试:

var reruiredObj = { "UserID": first , "UserName":second };

检查DEMO

答案 2 :(得分:0)

以下对我来说很好。

由于你的第一个tr没有td,它会给出未定义的错误。尝试以下

<table id="tbPermission">
 <thead>
   <tr>
    <th>User ID</th>
    <th>User Name</th>
  </tr>
 </thead>
  <tbody>
  <tr>
    <td>1</td>
    <td>Test1</td>
  </tr>
<tr>
    <td>2</td>
    <td>Test2</td>
  </tr>
<tr>
    <td>3</td>
    <td>Test3</td>
  </tr>
</tbody>
</table> 




    <script>
$(function () {
    var trArray = [];
var tdArray = [];
var reruiredObj = {"UserID":null,
                   "UserName":null
                  };


jsonObj = [];                 
var first;
var second;
$('#tbPermission tbody tr').each(function () {

    $(this).find('td').each(function (index) {
        //alert(index+'-'+ $(this).html());
        //alert(index);
        if(index == 0){
            first = $(this).html();
        }
        else{
            second = $(this).html();

        }
        //alert(JSON.stringify(reruiredObj));
    });
    alert(first+'-'+second)
    item = {}
    item ["UserID"] = first;
    item ["UserName"] = second;
    jsonObj.push(item);


});
console.log(jsonObj);
});
  </script>

警告jsonObj。这给出了所需的结果。