在 JavaScript 中合并多个排序对象数组的最有效方法是什么?
What's the most efficient way to merge multiple arrays of sorted objects in JavaScript?
考虑四个对象数组,所有对象都按日期单独排序
对象:{ 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
相关文章:
- 在jQuery中创建向下滑动子菜单的最有效方法
- 使用Underscore.js修改json数组中所选元素的更有效方法
- 选择具有值数组的所有元素的最有效方法
- 将JSON存储和恢复到此Ionic应用程序的最有效方法
- 将javascript数组中的项移动到特定位置的有效方法
- 将JS对象数组转换为嵌套形式的最有效方法
- 隐藏具有特定类$.each、for等的元素的有效方法
- 什么's是调用具有可变参数的函数的有效方法
- 选择具有特定数据的所有 html 标记的最有效方法是什么 - [适当性],无论值如何
- 使用 jQuery 调用 PHP 端点的最有效方法
- 这是解析 Int 的有效方法吗?
- 在JavaScript中搜索数组映射的最有效方法
- 获取字符串中最后一个换行符的最有效方法是什么
- 什么's是在两个(或多个)阵列中找到匹配的细胞序列的最有效方法
- 什么's是在IE8+中添加元素的最有效方法
- 从任何jquery选择器字符串创建元素的最有效方法
- 在日期范围内查找丢失日期的最有效方法是什么
- 对区间[1,10^12]中的整数进行编码/解码的快速有效方法是什么
- 在条件(if)结构的条件语句中是否有定义变量的有效方法
- 在ASP.NET中使用JQuery UI自动完成的有效方法