如何在JavaScript中合并排序的数组

Exc*_*ion 11 javascript

我有三个排序的数组,如下所示

[{name:"a"}, {name:"b"}, {name:"m"}, {name:"x"}]
[{name:"a"}, {name:"e"}, {name:"i"}, {name:"o"}]
[{name:"g"}, {name:"h"}, {name:"m"}, {name:"n"}]
Run Code Online (Sandbox Code Playgroud)

这些数组基于Array中每个对象的name属性进行排序.这是我从Java转换为合并两个排序数组的方法

function mergeSorted(a, b) {
  var answer = new Array(a.length + b.length), i = 0, j = 0, k = 0;
  while (i < a.length && j < b.length) {
    if (a[i].name < b[j].name) {
        answer[k] = a[i];
        i++;
    }else {
        answer[k] = b[j];
        j++;
    }
    k++;
  }
  while (i < a.length) {
    answer[k] = a[i];
    i++;
    k++;
  }
  while (j < b.length) {
    answer[k] = b[j];
    j++;
    k++;
  }
  return answer;
}
Run Code Online (Sandbox Code Playgroud)

这是两个数组http://jsfiddle.net/euRn5/的工作小提琴.用n个数组实现相同目标的最佳方法是什么,我脑海中的想法一个接一个,将它与先前合并的合并到最后一个项目,如n + = i stuff.这是最好的方法吗?

dav*_*vid 4

更新:

看来current_year这就是现在:

const mergeAll = (...arrays) => arrays.reduce(mergeSorted);
Run Code Online (Sandbox Code Playgroud)

原版的:

如果你感觉功能正常,这是一个使用减少的完美场所.

var mergeAll = function(){
    return Array.prototype.slice.call(arguments).reduce(mergeSorted);
};
Run Code Online (Sandbox Code Playgroud)

例:

var a = [{name:"a"}, {name:"b"}, {name:"m"}, {name:"x"}];
var b = [{name:"a"}, {name:"e"}, {name:"i"}, {name:"o"}];
var c = [{name:"g"}, {name:"h"}, {name:"m"}, {name:"n"}];

console.log(mergeAll(a,b,c).map(function(x){return x.name;}));
Run Code Online (Sandbox Code Playgroud)

jsfiddle:http://jsfiddle.net/FeT6m/

  • 这是一个可怕的解决方案.你在做*n*合并.这比从*n*源进行单一合并的性能差得多.我很困惑,为什么这将是公认的答案. (4认同)