2016-01-24 65 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)); 
相关问题