2013-06-03 40 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]