首页 > 解决方案 > 用'for'循环合并两个排序数组......如何阻止'i'在循环结束时增加

问题描述

我想将两个排序数组合并为一个排序数组,例如 [1, 3, 6, 7, 11] 和 [2, 3, 5, 8, 9, 10] 合并成为 [1, 2, 3, 3, 5 , 6, 7, 8, 9, 10, 11]。但是,我想在没有任何 JavaScript 数组方法(如 .push() 或 .concat() )的情况下执行此操作,因此我更加熟悉这些方法中的底层逻辑。这是我的代码。

const array1 = [1, 3, 6, 7, 11];
const array2 = [2, 3, 5, 8, 9, 10];

const set = (arr, index, value) => {
  return arr[index] = value;
}

const mergeArrs = (arr1, arr2) => {
  let loopLength = arr1.length >= arr2.length ? arr1.length : 
  arr2.length;
  let mergedArr = [];
  for (let i = 0; i < loopLength; i++) {
    if (arr1[i] <= arr2[i]) {
      console.log(i);
      mergedArr = [...mergedArr, set(mergedArr, i, arr1[i]), set(mergedArr, i + 1, arr2[i])];
    } else {
      console.log(i);
      mergedArr = [...mergedArr, set(mergedArr, i, arr2[i]), set(mergedArr, i + 1, arr1[i])];
    }
  }
  return mergedArr;
}

mergeArrs(array1, array2);

这是控制台的输出:

0
1
2
3
4
5
=> [ 1, 2, 3, 3, 5, 6, 7, 8, 9, 11, 10, undefined ]

我认为我的功能是正确的,但是我遇到了诸如数组仅相对于其原始位置进行合并/排序之类的问题。例如 arrayOne[4] = 11 和 arrayTwo[4] = 9,所以起初,它正确地去 [..., 9, 11, ...] 但后来因为 arrayOne 没有索引 5 而 arrayTwo 有, arrayTwo[5] = 10, 10 在 11: [..., 9, 11, 10, undefined] 之后附加到数组上,并且 undefined 在那里,因为第一个数组没有索引 5 所以它是未定义的...... idk......我似乎无法得到这个:(

我真的很感激任何帮助,谢谢

标签: javascriptarraysalgorithmloops

解决方案


对您的代码进行了一些更改,它现在可以工作了。

const array1 = [1, 3, 6, 7, 11];
    const array2 = [2, 3, 5, 8, 9, 10];

    const set = (arr, index, value) => {
        return arr[index] = value;
    }

    const mergeArrs = (arr1, arr2) => {
        let loopLength = arr1.length + arr2.length;
        let mergedArr = [];
        for (let i = 0; i <= loopLength; i++) {
            if (arr1.length && arr2.length) {
                if (arr1[0] <= arr2[0])
                    mergedArr = [...mergedArr, set(mergedArr, i, arr1.shift())];

                else
                    mergedArr = [...mergedArr, set(mergedArr, i, arr2.shift())];
            }
            else if (arr1.length) {
                mergedArr = [...mergedArr, set(mergedArr, i, arr1.shift())];
            }
            else if (arr2.length) {
                mergedArr = [...mergedArr, set(mergedArr, i, arr2.shift())];
            }
        }
        return mergedArr;
    }

    console.log(mergeArrs(array1, array2));


推荐阅读