【问题标题】:I keep getting cannot read property error我不断收到无法读取属性错误
【发布时间】:2019-04-27 16:44:05
【问题描述】:

我正在尝试做一个冒泡排序。我正在使用此算法对二维数组进行排序,但我不断收到错误消息。这是函数:

var array = [
    [ "Rober Hill"         , 123.54  ],
    [ "Chrsitopher Reddkin", 54.67   ],
    [ "Maggie Woods"       , 1000.87 ],
    [ "Jennifer Jones"     , 3.34    ],
    [ "Marcus Parker"      , 64.98   ]
];
table = document.getElementById("table");

function bubbleSort(array, length, element) 
{
    var swapped = false;
    do 
    {
        for (var a = 0; a < 5; a++) // Line 59
        {
            if (array[a][1] > array[a+1][1])
            {
                var temp = array[a][1];
                array[a][1] = array[a+1][1];
                array[a+1][1] = temp; 
                swapped = true; 
            }
        }
    } while(swapped);

    return array;

}

错误提示:Sorting.html:59 Uncaught TypeError: Cannot read property '0' of undefined。我在一个按钮上有这个功能。任何形式的帮助都会很好!谢谢你

【问题讨论】:

  • 第 59 行是哪一行?
  • 第 59 行:for (var a = 0; a
  • 您可以为自己和其他人创建一个工作演示吗?
  • 也许这个JsFiddle Demo 可能会有所帮助。我不知道你想用什么来订购它们,但要感谢 This Answer 我的示例中使用的函数源代码。
  • 我很怀疑那是第 59 行。控制台中的错误消息通常是可点击的,并且会直接将您带到源代码。

标签: javascript


【解决方案1】:

按原样运行您的代码,我得到:

Cannot read property '1' of undefined

这是因为在您的比较中,您正在尝试比较 array[a][1] &gt; array[a+1][1],除了最后一个循环之外,这有效,其中 array[a+1] 不存在,并且因为它不存在,所以 1 未定义。

这是一个可行的解决方案,但有一些显着差异。

  1. 我不知道您为什么将lengthelement 作为bubbleSort 的参数,但它们现在已经消失了
  2. 您可以只在 for 循环中使用数组长度,这样,如果您向数组中添加更多项,则无需更新您硬编码的 5
  3. for 循环中,I 从数组长度中减去 1,因此我们永远不会尝试将最后一项与不存在的项进行比较。
  4. 另外,我使用了i 而不是a,因为这是增量器的常用变量名。
  5. 我在do...while 中定义了swapped,否则您将创建一个无限循环,因为swapped 在第一次传递时将设置为true,并永远保持true
  6. 您不必返回数组,因为当您调用bubbleSort 时,它会修改原始数组

var array = [
  ["Rober Hill", 123.54],
  ["Chrsitopher Reddkin", 54.67],
  ["Maggie Woods", 1000.87],
  ["Jennifer Jones", 3.34],
  ["Marcus Parker", 64.98]
];

function bubbleSort(array) {
  do {
    var swapped = false;

    for (var i = 0; i < array.length - 1; i++) {
      if (array[i][1] > array[i + 1][1]) {
        var temp = array[i];

        array[i] = array[i + 1];
        array[i + 1] = temp;

        swapped = true;
      }
    }
  } while (swapped);
}

bubbleSort(array)
console.log(array);

【讨论】:

    【解决方案2】:

    var swapped = false; 移动到do {... 中。

    同时更新for 中的条件,它应该类似于a &lt; 4;,或者如果您使用广义条件作为a &lt; array.length - 1; 会更好

    var array = [
      ["Rober Hill", 123.54],
      ["Chrsitopher Reddkin", 54.67],
      ["Maggie Woods", 1000.87],
      ["Jennifer Jones", 3.34],
      ["Marcus Parker", 64.98]
    ];
    
    function bubbleSort(array, length, element) {
      do {
        var swapped = false;
        for (var a = 0; a < array.length - 1; a++) // Line 59
        {
          if (array[a][1] > array[a + 1][1]) {
            var temp = array[a][1];
            array[a][1] = array[a + 1][1];
            array[a + 1][1] = temp;
            swapped = true;
          }
        }
      } while (swapped);
    
      return array;
    
    }
    
    console.log(bubbleSort(array));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      相关资源
      最近更新 更多