为什么这个冒泡不起作用

时间:2018-03-26 14:26:44

标签: javascript angular typescript tuples bubble-sort

我需要通过包含元组的第二个元素对以下数组进行排序。该过程一直持续到最后一个元素已经过去。之后我得到了例外

  

错误类型错误:无法读取属性' 1'未定义的

这是我用过的代码:

public list:Array<[string, number]> = new Array<[string, number]>();
//{["A", 0],["B", 8], ...}
...

var sorted = false
while (!sorted){
    sorted = true;
    this.list.forEach(function (element, index, array){
      alert(element);
      if (element[1] > array[index+1][1] ) {
        array[index][1] = array[index+1][1];
        array[index+1] = element;
        sorted = false;
      }
   });
}

我无法理解,为什么这不起作用

1 个答案:

答案 0 :(得分:2)

这一行:

  array[index+1][1];

原因

  

错误类型错误:无法读取未定义的属性“1”

这是因为当迭代到达最后一个索引时,例如5,它会尝试从数组中取6,这显然不存在。因此,您需要在迭代时跳过最后一个索引,例如:

 if(array.length - 1 === index)
  return;

我将如何做到这一点:

 var sorted = false;

 while(!sorted){
   sorted = true;
   for(let index = 1; index < array.length; index++) {
      if(array[index][1] < array[index - 1][1]) {
       ([array[index], array[index - 1]] = [array[index - 1], array[index]]);
       sorted = false;
   }
 }

或更简单:

 array.sort((a, b) => a[1] - b[1])