在 JavaScript 中合并多个排序对象数组的最有效方法是什么?

What's the most efficient way to merge multiple arrays of sorted objects in JavaScript?

本文关键字:有效 方法 是什么 数组 对象 JavaScript 合并 排序      更新时间:2023-09-26

考虑四个对象数组,所有对象都按日期单独排序

对象:{ id: userId, date : date }

使用 JavaScript 我应该如何按日期将这些列表排序到一个合并列表中?

这是四个列表单独预先排序的小提琴。

如果你肯定会对传递给你的数组进行排序,我能想到的最有效的事情就是制作你自己的合并算法。 它会是这样的:

var merged = [];
var arrIndex1 = 0;
var arrIndex2 = 0;
var arrIndex3 = 0;
var arrIndex4 = 0;
while (arrIndex1 < arr1.length || arrIndex2 < arr2.length || arrIndex3 < arr3.length || arrIndex4 < arr4.length) {
     var val1 = arrIndex1 < arr1.length ? arr1[arrIndex1].date : Number.POSITIVE_INFINITY;
     var val2 = arrIndex2 < arr1.length ? arr2[arrIndex2].date : Number.POSITIVE_INFINITY;
     var val3 = arrIndex3 < arr1.length ? arr3[arrIndex3].date : Number.POSITIVE_INFINITY;
     var val4 = arrIndex4 < arr1.length ? arr4[arrIndex4].date : Number.POSITIVE_INFINITY;
     if (val1 < val2 && val1 < val3 && val1 < val4) {
          merged.push(arr1[arrIndex1++]); 
     } else if (val2 < val2 && val1 < val3 && val1 < val4) {
          merged.push(arr2[arrIndex2++]); 
     } else if (val3 < val2 && val1 < val3 && val1 < val4) {
          merged.push(arr3[arrIndex3++]); 
     } else {
          merged.push(arr4[arrIndex4++]); 
     }
}

这将是最快的方法。 但是,编写代码的最简单方法 - 如果您不担心它是最快的 - 只需将四个数组splice在一起,然后通过activites.sort()函数运行它们。

因为我有困难的事情要做,需要拖延:-)这是一个函数"mergeSortedArrays"。

它可以接受任意数量的参数,因此您可以将其调用为:

var resultSorted = mergeSortedArrays(resultA, resultB, resultC, resultD);

它不如它所能达到的好,因为它一次只能合并两个数组。也许最好的实现会同时合并所有数组。(我不确定这会如何比较)

实现:

function mergeSortedArrays() {
    function merge(arrayOne, arrayTwo) {        
        var totalLength = arrayOne.length + arrayTwo.length;
        var returnArray = new Array(totalLength);
        var iResult = 0;
        var iOne = 0;
        var iTwo = 0;
        for(var i = 0; i < totalLength; ++i) {
            if(iTwo < arrayTwo.length) {
                if(iOne >= arrayOne.length) {
                    returnArray[i] = arrayTwo[iTwo++];                    
                } else if (arrayOne[iOne].date < arrayTwo[iTwo].date) {
                    returnArray[i] = arrayOne[iOne++];
                } else {
                    returnArray[i] = arrayTwo[iTwo++];
                }  
            } else {
                returnArray[i] = arrayOne[iOne++];
            }
        }
        return returnArray;
    }
    var sortedArray = [];
    for(var i = 0; i < arguments.length; ++i) {
        sortedArray = merge(sortedArray, arguments[i]);
    }
    return sortedArray;
}

这是 jsFiddle