开发者问题收集

我一直收到无法读取属性错误

2018-11-26
62

我正在尝试执行冒泡排序。我正在使用此算法对二维数组进行排序,但一直出现错误。这是函数:

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 。我在一个按钮上有这个函数。任何帮助都很好!谢谢

2个回答

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

无法读取未定义的属性“1”

这是因为在您的比较中,您试图比较 array[a][1] > array[a+1][1] ,除了最后一个循环外,此方法有效,因为最后一个循环中 array[a+1] 不存在,并且由于不存在,所以 1 未定义。

这是一个可行的解决方案,但有一些明显的区别。

  1. 我不知道为什么您的 bubbleSortlengthelement 作为参数,但它们现在消失了
  2. 您可以在 for 循环中使用数组长度,这样,如果您向数组中添加更多项目,则不必更新您硬编码的 5
  3. for 循环中,我从数组长度中减 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);
AnonymousSB
2018-11-26

var swapped = false; 移到 do {... 内。

同时更新 for 中的条件,它应该像 a < 4; ,或者最好使用通用条件,如 a < 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));
Karan
2018-11-26