【问题标题】:Shift is not a function in javascriptShift 不是 javascript 中的函数
【发布时间】:2017-03-21 12:46:20
【问题描述】:

我的 html 中有多个表(结构相同)。它们在标签中。我正在动态创建选项卡,我想将这些表数据发送到 mysql 数据库。所以我想使用javascript获取这些数据。我使用 for 循环正确创建了 TableData1,TableData2.... 数组。问题是我不能在这里增加 TableData ('TableData'+i).shift(); 。我收到一个错误。我想创建 TableData1.shift(),TableData2.shift().....

function myDataSendFunction(){
var i;

     for(i = 1; i <= array_size; i++){
         eval("var TableData"+i+"=[];");

      $('#mytable'+i+ ' tr').each(function(row, tr){
          ('TableData'+i)[row]={
              "colum1" : $(tr).find('td:eq(1)').text()
              , "colum2" :$(tr).find('td:eq(2)').text()
              , "colum3" : $(tr).find('td:eq(3)').text()
              , "colum4" : $(tr).find('td:eq(4)').text()
              , "colum5" : $(tr).find('td:eq(5)').text()
              , "colum6" : $(tr).find('td:eq(6)').text()
              , "colum7" : $(tr).find('td:eq(7)').text()
              , "colum8" : $(tr).find('td:eq(8)').text()
          }
      }); 

        ('TableData'+i).shift(); 

    }

}

我收到此错误。

Uncaught TypeError: ("TableData" + i).shift is not a function
    at myDataSendFunction (<anonymous>:25:25)
    at HTMLInputElement.onclick (create.php:1)

【问题讨论】:

  • 'TableData'+i 是一个字符串,而不是一个数组。也请不要使用eval()
  • 您遗漏了eval,从某个角度来看,这根本不是一件坏事。最好让 TableData 本身成为一个数组,因为这样你就不必求助于 eval() 的那种令人不快且会破坏性能的用法。
  • 这表明您应该重新考虑您的代码eval("var TableData"+i+"=[];"); 不要将eval() 用于这样简单的事情。
  • 对不起,这是我的第一个 Web 开发。我想根据我在 html 中创建的表创建 TableData1、TableData2、TableData3 的数组。表数是一个变体。那么我如何在不使用 eval 的情况下创建 TableData1[],TableData2[].....?然后我需要删除这些表的第一行。这就是我使用 shift 的原因。
  • TableData 设为数组。 然后您可以使用TableData[0]TableData[1] 等,然后您可以实际使用TableData.shift();。您根本无法使用普通变量来做到这一点(好吧,不是以任何不可怕的方式)。

标签: javascript jquery shift


【解决方案1】:

很明显你对此很陌生,所以我先给你看,然后再解释。

function myDataSendFunction(){
    var i,
        TableData = [];

    for(i = 1; i <= array_size; i++){
        TableData[i] = [];

        $('#mytable' + i + ' tr').each(function(row, tr){
            TableData[i][row]={
                  "colum1" : $(tr).find('td:eq(1)').text()
                , "colum2" : $(tr).find('td:eq(2)').text()
                , "colum3" : $(tr).find('td:eq(3)').text()
                , "colum4" : $(tr).find('td:eq(4)').text()
                , "colum5" : $(tr).find('td:eq(5)').text()
                , "colum6" : $(tr).find('td:eq(6)').text()
                , "colum7" : $(tr).find('td:eq(7)').text()
                , "colum8" : $(tr).find('td:eq(8)').text()
            };
        }); 

        TableData[i].shift();
    }
}

基地on your comment:

那我该怎么办??我尝试使用 TableData 数组,然后问题出现在这里 TableData[i][row] with Uncaught TypeError: Cannot set property '0' of undefined

您的麻烦在于为尚未定义的变量设置属性。您必须在尝试分配属性之前定义 TableData

一旦TableData 被“初始化”为一个数组 (var TableData = []),您就可以在TableData 上设置属性。但是您不能立即在TableData 的属性上设置属性。例如,您不能直接跳转到TableData[i][row]。您必须首先将TableData[i] 设置为一个数组(TableData[i] = []),然后您可以将TableData[i][row] 设置为某个值。

通过尝试使用eval 解决该问题,您遇到了一个全新的问题世界。尽量避免eval...这是一个非常复杂的野兽,往往会引起很多混乱和痛苦。

查看 MDN's Working with objects 文档可能会有所帮助,以更好地了解 JavaScript 的数组和对象的情况。

【讨论】:

    【解决方案2】:

    显然你的元素选择是你犯的错误。通过硬编码 array_size 而不使用 for 循环,您可以轻松地

    1. 使用类等公共属性一次选择所有表。您将获得一个包含表格对象的数组。
    2. 迭代表对象数组。
    3. 在循环中选择每个表的所有行并将它们放入另一个循环中以提取数据并创建发送到数据库的数据数组。

    找到我的sample implementation here

    请记住,当您计划使用数组时,请坚持使用数组,而不是在字符串和数组之间来回移动。它会给你带来一些问题,比如你已经遇到的问题和不必要的脏代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      相关资源
      最近更新 更多