基于最终排序索引

时间:2016-01-24 22:05:50

标签: javascript node.js sorting

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

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之间)。是否有任何方法可以使用本机排序函数或任何其他已知方式来实现此独特排序。

2 个答案:

答案 0 :(得分:1)

此解决方案的特色是while loopfor loop,每个找到的最大项目的数据集都在递减。

&#13;
&#13;
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>');
&#13;
&#13;
&#13;

答案 1 :(得分:1)

正如@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));