复制Excel的“排序依据”,“然后依赖”行为

时间:2012-12-29 12:17:36

标签: javascript arrays sorting

复制Excel对JS的排序的最佳方法是什么?

假设我有一个包含项目的数组:

[6,0.75]
[6,0.81]
[9,0.75]
[4,0.20]

通过第一个键对它们进行排序很容易但是如何复制“然后”排序? Excel将使用第一个键desc和第二个键desc吐出以下结果:

[9,0.75]
[6,0.81]
[6,0.75]
[4,0.20]

2 个答案:

答案 0 :(得分:2)

对于给定的示例,有更简单的方法可以执行此操作,但在一般情况下,您可以将函数传递给sort方法,该方法将按指定的顺序比较每对值。 (jsfiddle

var arr1 = [[6, 0.75], [6, 0.81], [9, 0.75], [4, 0.20]],
    arr2 = [[6, 0.75], [6, 0.81], [9, 0.75], [4, 0.20]],
people = [{name: 'Jim', age: 40}, {name: 'Sally', age: 35},
          {name: 'Tim', age: 20}, {name: 'Jim', age: 72}];

function orderedComparison(indices) {
    return function(a, b) {
        for (var i = 0; i < indices.length; i++) {
            if (a[indices[i]] > b[indices[i]]) return 1;
            if (a[indices[i]] < b[indices[i]]) return -1;
            // (if a == b, check next index)
        }
    }
}
// sort by first item in each pair, then 2nd
arr1.sort(orderedComparison([0, 1]));
console.log(arr1);
// sort by 2nd item then 1st
arr2.sort(orderedComparison([1, 0]));
console.log(arr2); 
people.sort(orderedComparison(['name', 'age']));
console.log(people);​

请注意,以下内容只需按优先级较低的键排序,然后按优先级较高的键排序,可能会有效not guaranteed to

arr1.sort(function(a, b) {return a[1] - b[1]});
arr1.sort(function(a, b) {return a[0] - b[0]});

答案 1 :(得分:0)

您可以通过缩放每个子索引来复制此功能,使其大小不重叠,并使用Array.sort();进行标准比较

这个jsfiddle演示了它:http://jsfiddle.net/Jd2ne/2/

提示:当你用科学记数法写出数字时,如果你不知道它的大小是十的指数。 I. e:6 = 6 * 10 ^ 0 => 6的幅度为零。