2013-06-03 37 views
12

几个小时我一直在试图找出如何排序2个数组依赖。我想我有2个数组。JavaScript,排序2数组依赖

第一招:

array1 = ['zzzzz', 'aaaaaa', 'ccccc']; 

,第二个:

array2 = [3, 7, 1]; 

我排序的第一个与array1.sort();,并成为[aaaaaa, cccccc, zzzzzz] 现在我想的是,第二个成为[7, 1, 3]

我认为这很简单,但我试图在一些更复杂的东西实现这一点,即时新和我不断混合的东西。

由于

+0

在我看来,这似乎是一个关键/值对问题。 aaaaa是7的关键,ccccc是1的关键字,zzzzz是3的关键字。你的用例是否绝对要求你维护两个不同的数组,或者你是否愿意将它们组合成一个对象的单个数组,类似于: arr = [{“key”:“aaaaaa”,“value”:7},{“key”:“zzzzzz”,“value”:3},........]? –

回答

1

代替原始类型(字符串,数字)的两个阵列可以使对象的阵列,其中所述对象的一个​​性质是:(含有“AAAAA”,“CCCCCC”,“ZZZZZZ”)串另一个是数字(7,1,3)。这样你将只有一个数组,你can sort by any property和其他属性将保持同步。

11

我将“压缩”他们为对象的一个​​数组,然后进行排序与​​自定义排序回调,然后选择“解压”它们放回你想要的两个数组:

var array1 = ['zzzzz', 'aaaaaa', 'ccccc'], 
    array2 = [3, 7, 1], 
    zipped = [], 
    i; 

for(i=0; i<array1.length; ++i) { 
    zipped.push({ 
     array1elem: array1[i], 
     array2elem: array2[i] 
    }); 
} 

zipped.sort(function(left, right) { 
    var leftArray1elem = left.array1elem, 
     rightArray1elem = right.array1elem; 

    return leftArray1elem === rightArray1elem ? 0 : (leftArray1elem < rightArray1elem ? -1 : 1); 
}); 

array1 = []; 
array2 = []; 
for(i=0; i<zipped.length; ++i) { 
    array1.push(zipped[i].array1elem); 
    array2.push(zipped[i].array2elem); 
} 

alert('Sorted arrays:\n\narray1: ' + array1 + '\n\narray2: ' + array2); 

这里有一个working fiddle

1

假设:

  • 的数组的长度相同(这是由你的问题暗示)
  • 的内容可以用><(真在你的例子拿来比较,但我想让它明确它在这里假设)

那么我们可以使用插入排序。

var value,len = array1.length; 
for (i=0; i < len; i++) { 
     value = array1[i]; 
     for (j=i-1; j > -1 && array1[j] > value; j--) { 
      array1[j+1] = array1[j]; 
      array2[j+1] = array2[j]; 
     } 

     items[j+1] = value; 
} 
+0

OP要求没有循环可能的解决方案 –

+1

@YuriyGalanter“如果可能的话我想,只有一个解决方案‘维权’和IFS””没有,他问了一个具有循环 –

+0

@YuriyGalanter虽然他现在删除的任何引用在所有循环 –

1

碰巧我有一些旧代码躺在附近,可能做的伎俩:

function arrVirtualSortGetIndices(array,fnCompare){ 
    var index=array.map(function(e,i,a){return i;}); 
    fnCompare=fnCompare || defaultStringCompare; 
    var idxCompare=function (aa,bb){return fnCompare(array[aa],array[bb]);}; 
    index.sort(idxCompare); 
    return index; 

    function defaultStringCompare(aa,bb){ 
     if(aa<bb)return -1; 
     if(bb<aa)return 1; 
     return 0; 
    } 
    function defaultNumericalCompare(aa,bb){ 
     return aa-bb; 
    } 
} 

function arrReorderByIndices(array,indices){ 
    return array.map(
     function(el,ix,ar){ 
      return ar[indices[ix]]; 
     } 
    ); 
} 

var array1 = ['zzzzz', 'aaaaaa', 'ccccc']; 
var array2 = [3, 7, 1]; 
var indices=arrVirtualSortGetIndices(array1); 
var array2sorted=arrReorderByIndices(array2,indices); 
array2sorted; 

/* 
7,1,3 
*/ 

对不起,我不做“维权”。至少不是当我不需要的时候。

fiddle


此外,替代fiddle给定对象的一个​​这样的数组时分类结果:

给出:

var list = [ 
    {str:'zzzzz',value:3}, 
    {str:'aaaaa',value:7}, 
    {str:'ccccc',value:1} 
]; 

输出:

[ 
    {str: "aaaaa", value: 7}, 
    {str: "ccccc", value: 1}, 
    {str: "zzzzz", value: 3} 
] 
0

使用溶液找到here排序后找到新的索引数组,你可以a将这些指数应用到array2之类的。

function sortWithIndices(toSort) { 
    for (var i = 0; i < toSort.length; i++) { 
    toSort[i] = [toSort[i], i]; 
    } 
    toSort.sort(function(left, right) { 
    return left[0] < right[0] ? -1 : 1; 
    }); 
    toSort.sortIndices = []; 
    for (var j = 0; j < toSort.length; j++) { 
    toSort.sortIndices.push(toSort[j][2]); 
    toSort[j] = toSort[j][0]; 
    } 
    return toSort; 
} 


var array1 = ['zzzz', 'aaaa', 'cccc']; 
var array2 = [3, 7, 1]; 

// calculate the indices of array1 after sorting. (attached to array1.sortIndices) 
sortWithIndices(array1); 

// the final array after applying the sorted indices from array1 to array2 
var final = []; 

// apply sorted indices to array2 
for(var i = 0; i < array1.sortIndices.length; i++) 
    final[i] = array2[array1.sortIndices[i]]; 

// output results 
alert(final.join(",")); 

JSFiddle Demo

2

这里有一个简单的函数,将这样的伎俩:

function sortTogether(array1, array2) { 
    var merged = []; 
    for(var i=0; i<array1.length; i++) { merged.push({'a1': array1[i], 'a2': array2[i]}); } 
    merged.sort(function(o1, o2) { return ((o1.a1 < o2.a1) ? -1 : ((o1.a1 == o2.a1) ? 0 : 1)); }); 
    for(var i=0; i<merged.length; i++) { array1[i] = merged[i].a1; array2[i] = merged[i].a2; } 
} 

Usage demo (fiddle here)

var array1 = ['zzzzz', 'aaaaaa', 'ccccc']; 
var array2 = [3, 7, 1]; 
console.log('Before..: ',array1,array2); 

sortTogether(array1, array2); // simply call the function 

console.log('After...: ',array1,array2); 

输出:

Before..: ["zzzzz", "aaaaaa", "ccccc"] [3, 7, 1] 
After...: ["aaaaaa", "ccccc", "zzzzz"] [7, 1, 3]