2016-01-24 93 views
0

我需要對包含多個鍵的數組進行排序,這些鍵的值與索引順序有關。見例如:根據最終排序索引對多個鍵進行JavaScript複雜排序

var array = [ 
    { 
     0: .5, 
     1: .3, 
     2: .15 
    }, 
    { 
     0: .7, 
     1: .25, 
     2: .9 
    }, 
    { 
     0: .45, 
     1: .9, 
     2: .08 
    } 
]; 

我想基於鍵的值進行排序,關鍵是排序的最終結果中的對象的最終指標。在上面的例子中,數組中的第二個對象將被放置在索引0中,因爲它包含該索引的最高數字。接着是第三個對象,最後是第一個對象。目前的實現:

var array = [ 
    { 
     0: .5, 
     1: .3, 
     2: .15 
    }, 
    { 
     0: .7, 
     1: .25, 
     2: .9 
    }, 
    { 
     0: .45, 
     1: .9, 
     2: .08 
    } 
]; 


var final = [null,null,null]; 

var largest; 
for(var f=0;f<final.length;f++) 
{ 
    largest = null; 
    for(var a=0; a <array.length;a++) 
    { 
     var obj = array[a][f]; 
     if(!largest || (obj > largest[f] && final.indexOf(array[a]) == -1)) 
     { 
      largest = array[a]; 
     } 
    } 
    final[f] = largest; 
} 

console.log(final); 

雖然我目前的實施工作,它不是很優化。這是在node.js中運行的,具有超過1500個對象的數組。最終的數組不需要包含所有的1500個對象,而是用戶啓動的限制(3到15之間)。有沒有什麼方法可以使用本地排序功能或其他已知方式實現這種獨特的排序。

回答

1

該解決方案的特色是while loopfor loop,其中每個找到的最大項目的數據集越少。

var array = [{ 0: .5, 1: .3, 2: .15 }, { 0: .7, 1: .25, 2: .9 }, { 0: .45, 1: .9, 2: .08 }], 
 
    final = [], 
 
    largest, a, f = 0; 
 

 
while (array.length) { 
 
    largest = 0; 
 
    for (a = 1; a < array.length; a++) { 
 
     if (array[a][f] > array[largest][f]) { 
 
      largest = a; 
 
     } 
 
    } 
 
    final.push(array.splice(largest, 1)); 
 
    f++; 
 
} 
 

 
document.write('<pre>' + JSON.stringify(final, 0, 4) + '</pre>');

1

由於@usandfriends指出,你應該使用自定義分類器implentation。不過,在你的情況下,你想在使用它之前動態創建一個,這樣你的自定義索引就可以成爲排序鍵。

例如:

var createCustomSorter = function (index) { 
    return function (a, b) { 
     return a[index] > b[index] ? 1 : -1; 
    }; 
}; 

var customSorter = createCustomSorter(1) 

console.log(array.sort(customSorter)); 
相關問題