基于另一个数组的值对JS数组进行排序的最快方法?

cro*_*lee 8 javascript arrays

有一些类似的帖子敲了敲,但我找不到任何可以解决这个特定问题...我有两个配对值数组:

var A=[0.5, 0.6, 0.5, 0.7, 0.8, 0.1]
var B=['a','b','c','d','e','f']
//note: a=0.5, b=0.6, c=0.5, d=0.7, etc
Run Code Online (Sandbox Code Playgroud)

什么是处理器最友好的方式来排序数组,以便数组A按数字升序排列,数据结构是否保持?我想内置的array.sort(函数)会最快,但我对语法没有信心.

ale*_*lex 12

有点hacky,但它确实有效.

var A = [0.5, 0.6, 0.5, 0.7, 0.8, 0.1];
var B = ['a', 'b', 'c', 'd', 'e', 'f'];

var all = [];

for (var i = 0; i < B.length; i++) {
    all.push({ 'A': A[i], 'B': B[i] });
}

all.sort(function(a, b) {
  return a.A - b.A;
});

A = [];
B = [];

for (var i = 0; i < all.length; i++) {
   A.push(all[i].A);
   B.push(all[i].B);
}    

console.log(A, B);
Run Code Online (Sandbox Code Playgroud)

jsFiddle.

产量

0.1, 0.5, 0.5, 0.6, 0.7, 0.8
["f", "a", "c", "b", "d", "e"]
Run Code Online (Sandbox Code Playgroud)

基本上,我们正在制作一个在新数组之间AB内部之间有清晰联系的对象,然后再sort()这样做.

然后我回去重建原来的两个阵列.

更新

MárÖrlygsson在评论中提出了一个很好的观点.而不是生成对象等{A: 0.5, B: 'a'},他建议将所述A一个B值的阵列等[0.5, 'a'].

应该更快,但如果需要调试all数组,它的可读性会略低一些.如果您遇到性能问题,请将这些方法分析出来并选择最快的方法.


woo*_*666 9

我注意到上述所有解决方案都使用了地图.另一种节省一点内存的方法是创建一个索引数组,根据A对索引进行排序,然后根据索引重建A和B.

var A=[0.5, 0.6, 0.5, 0.7, 0.8, 0.1];
var B=['a','b','c','d','e','f'];
var indices = A.map(function(elem, index){return index;}); //an array of indices
indices.sort(function (a,b) {return A[a] - A[b];});

//print out the results
for (var i = 0; i < A.length; i++)
    document.body.innerHTML += 'A: ' + A[indices[i]] + ', B: ' + B[indices[i]] + '<br>';
Run Code Online (Sandbox Code Playgroud)

这是jsfiddle

编辑:由chowey的评论启发的半单线:

var BSorted = A.map(function(e,i){return i;})
               .sort(function(a,b){return A[a] - A[b];})
               .map(function(e){return B[e];});
Run Code Online (Sandbox Code Playgroud)