合并排序的JS范围请帮助我理解

JS scope for merge sorting please help me understnad

有人可以帮我理解为什么第一段代码有效而第二段代码无效吗?试图解决按顺序合并到数组的问题。第一个是解决方案代码,第二个是我想出的代码。 我无法理解为什么 i 变量似乎停留在工作循环中的循环中,但在我的代码中,当尝试在 while 循环中使用它时,arr1Item 似乎消失了?

const gerry = [0,3,4,31] 
const machmoud = [4,6,30]

const mergeSort = (arr1, arr2) => {
  const mergedArr = [];
  //init Counters
  let i= 1
  let j= 1
  let arr1Item = arr1[0]
  let arr2Item = arr2[0]
  
  while(arr1Item || arr2Item){        
    if(arr1Item < arr2Item || !arr2Item){
      mergedArr.push(arr1Item)
      arr1Item = arr1[i]
      i++
    }
      else{
        mergedArr.push(arr2Item)
        arr2Item = arr2[j]
        j++
      }
    
  }
  return mergedArr
}

console.log(mergeSort(gerry, machmoud))

第二组代码

const gerry = [0,3,4,31] 
const machmoud = [4,6,30]

const mergeSort = (arr1, arr2) => {
  const mergedArr = [];
  //init Counters
  let i= 0
  let j= 0
  let arr1Item = arr1[j]
  let arr2Item = arr2[i]
  
  while(arr1Item || arr2Item){        
    if(arr1Item < arr2Item || !arr2Item){
      mergedArr.push(arr1Item)
      i++
    }
      else{
        mergedArr.push(arr2Item)
        j++
      }
    
  }
  return mergedArr
}


console.log(mergeSort(gerry, machmoud))

这会进入无限循环。

您的代码(第二块)的主要问题是循环永远不会更新 arr1Itemarr2Item 的值,因此 while 条件永远无法计算为除了它第一次做的任何事情。因此你会得到一个无限循环。所以一旦你改变 ij 应该也应该从数组中读取相应的值到相关变量中。

但是,这两种实现方式都存在一个问题。如果他们得到两个数组的第一个数组值都是 0,或者即使只有第二个数组以 0 开头,结果也不会像预期的那样。你真的应该与 undefined 进行比较。这是您更正的代码:

const gerry = [0, 3, 4, 31];
const machmoud = [4, 6, 30];

const mergeSort = (arr1, arr2) => {
  const mergedArr = [];
  //init Counters
  let i = 0;
  let j = 0;
  let arr1Item = arr1[i];
  let arr2Item = arr2[j];

  while (arr1Item !== undefined || arr2Item !== undefined) {
    if (arr1Item < arr2Item || arr2Item === undefined) {
      mergedArr.push(arr1Item);
      i++;
      arr1Item = arr1[i];
    } else {
      mergedArr.push(arr2Item);
      j++;
      arr2Item = arr2[j];
    }
  }
  return mergedArr;
}

console.log(mergeSort(gerry, machmoud));