我想将两个排序数组合并为一个排序数组,例如[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,所以它是undefined ... idk ...我似乎无法得到这个:(
非常感谢您的帮助
答案 0 :(得分:3)
您可以进行一些while
循环,因为您可以独立检查索引并根据需要推送值,并为推送的值增加索引。
第一个while
循环检查两个索引,并包含获取较小值的检查。
另外两个while
循环对于将剩余值添加到merged
数组是必需的。
var array1 = [1, 3, 6, 7, 11],
array2 = [2, 3, 5, 8, 9, 10],
merged = [],
i = 0,
j = 0;
while (i < array1.length && j < array2.length) {
if (array1[i] < array2[j]) {
merged = [...merged, array1[i++]];
continue;
}
merged = [...merged, array2[j++]];
}
while (i < array1.length) merged = [...merged, array1[i++]];
while (j < array2.length) merged = [...merged, array2[j++]];
console.log(...merged);
另一种方法
function merge([v, ...a], [w, ...b]) {
return v < w
? [v, ...(a.length ? merge(a, [w, ...b]) : [w, ...b])]
: [w, ...(b.length ? merge([v, ...a], b) : [v, ...a])];
}
console.log(...merge([1, 3, 6, 7, 11], [2, 3, 5, 8, 9, 10]));
答案 1 :(得分:2)
您对代码做了一些更改,现在可以正常工作。
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));
答案 2 :(得分:2)
使用while循环的东西可以完成这项工作。只要数组不为空,您只需比较每个较小的元素。然后,您增加右索引(包含所选值的数组之一),而另一个保持不变。
function mergeArrs(arr1, arr2) {
let i = 0,
j = 0,
k = 0,
mergedArr = [];
//compare as long as they're not empty
while (i != arr1.length && j != arr2.length) {
if (arr1[i] > arr2[j])
mergedArr[k++] = arr2[j++];
else
mergedArr[k++] = arr1[i++];
}
// empty the remainder
while (i < arr1.length)
mergedArr[k++] = arr1[i++];
while (j < arr2.length)
mergedArr[k++] = arr2[j++];
return mergedArr;
}