【问题标题】:jQuery: Can't iteratejQuery:无法迭代
【发布时间】:2011-11-10 19:05:36
【问题描述】:

我正在遍历一个表格以从每个表格行中挑选出表单元素。在下面的示例中我做错了什么?

var result = new Array();
var counter = 1;

$('tbody tr', this.el).each(function(){

    var inner = new Array();

    $('input',this).each(function(){
        console.log(this.name, $(this).val());  // Works: sends name/value to console!
        inner[this.name] = $(this).val(); // Appears to be empty
    });

    result[counter] = inner;
    counter++;
});

console.log(result);

【问题讨论】:

  • 尝试删除 $() 中的“this.el”。
  • 不,不是这样。我正在迭代 backbone.js-view 中的当前元素,当我通过 console.log 访问它们时结果就在那里,但不会附加到我的数组中......

标签: jquery arrays iteration


【解决方案1】:

不要在循环内启动对象变量,将其放在循环之前以提高性能。

祝你好运!

【讨论】:

    【解决方案2】:

    你做错了数组。

    在 Javascript 中,数组是对象的一种特殊情况,它只有 数字键,并具有由 push 等函数定义的接口:

    var myArray = [];
    myArray.push("first element");
    myArray.push("second element");
    myArray.push("third element");
    

    您犯了一个非常常见的错误,即尝试像更通用的对象一样使用数组,分配 字符串键 并使用x[y] = z 表示法来做到这一点。这是一种 hack,有时可能碰巧似乎有效,但 不是应该如何使用数组

    innerresult 有同样的问题。

    改为使用您最初尝试使用的通用对象:

    var result  = {};     // <!-- create new _object_
    var counter = 1;
    
    $('tbody tr', this.el).each(function() {
    
        var inner = {};   // <!-- create new _object_
    
        $('input', this).each(function() {
            var val = this.value;
    
            console.log(this.name, val);
            inner[this.name] = val;
        });
    
        result[counter] = inner;
        counter++;
    });
    
    console.log(result);
    

    【讨论】:

      【解决方案3】:

      试试这个:

      var result = new Array();
      var counter = 1;
      var inctr = 0;
      
      $('tbody tr', this.el).each(function(){
      
          var inner = new Array();
          inctr = 0;
      
          $('input',this).each(function(){
              console.log(this.name, $(this).val());  // Works: sends name/value to console!
              inctr++;
              inner[inctr] = $(this).val(); // Appears to be empty
          });
      
          result[counter] = inner;
          counter++;
      });
      
      console.log(result);
      

      【讨论】:

        【解决方案4】:

        使用

        var inner = {};
        

        而不是

        var inner = new Array();
        

        使用for-in 语句进行迭代

        results 也应该相同,或者使用results.push(),但在这种情况下不需要使用counter,因为索引是自动设置的

        【讨论】:

          猜你喜欢
          • 2016-08-23
          • 1970-01-01
          • 1970-01-01
          • 2019-03-26
          • 2018-07-18
          • 1970-01-01
          • 2016-09-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多