【问题标题】:JavaScript complex sort with multiple keys based on final sort index基于最终排序索引的具有多个键的 JavaScript 复杂排序
【发布时间】:2016-01-26 08:00:45
【问题描述】:

我需要对一个对象数组进行排序,其中包含多个键,其值与索引顺序有关。见例子:

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

我想根据键的值进行排序,键是排序最终结果中对象的最终索引。在上面的示例中,数组中的第二个对象将被放置在索引 0 中,因为它包含该索引的最大数字。接着是第 3 个对象,最后是第 1 个。当前实现:

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 之间)。有什么方法可以使用本机排序功能或任何其他已知方式来实现这种独特的排序。

【问题讨论】:

    标签: javascript node.js sorting


    【解决方案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>');

    【讨论】:

      【解决方案2】:

      正如@usandfriends 指出的那样,您应该使用自定义排序器实现。但是,在您的情况下,您希望在使用它之前动态创建一个,以便您的自定义索引可以成为排序键。

      例如:

      var createCustomSorter = function (index) {
          return function (a, b) {
              return a[index] > b[index] ? 1 : -1;
          };
      };
      
      var customSorter = createCustomSorter(1)
      
      console.log(array.sort(customSorter));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-08
        • 2013-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-20
        相关资源
        最近更新 更多