0

如果我有一个带有并行数组的对象:

var obj = {};
obj['aa'] = [5,2,7,0];
obj['bb'] = ['b', 'e', 'f', 'a'];
obj['cc'] = [12, 66, 77, 43];

如何根据其中一个值对数组进行排序?例如,我希望根据“aa”数组的值对三个数组进行排序。我试过了

obj.sort(function(a, b) {return aa.a - bb.a;});

但这不起作用。这显然是错误的。请帮忙。谢谢你。

4

2 回答 2

4

如果您希望基于其中一个数组的排序进行并行排序,您可以创建一个对象数组,其中包含当前索引的每个对象的相应属性。然后就像一个普通的对象数组一样排序并将结果转换回来。

obj.aa.map(function(_, i) {
    var o = {};
    for (var p in obj) {
        o[p] = obj[p][i];
    }
    return o
}).sort(function(a,b) {
    return a.aa - b.aa;

}).forEach(function(o, i) {
    for (var p in obj) {
        obj[p][i] = o[p];
    }
});

如以下评论中所述,由于某些优化,这可能会失败。

如果您希望基于其中一个数组的排序进行并行排序,您可以创建一个排序助手来对主数组进行排序并缓存结果,然后在其余数组上按排序播放结果.

function parallel_sort(fn, arr1 /*, arr2, ..., arrn */) {
    var results = [],
        playback = function() {
            var j = 0;
            return function() {
                return results[j++];
            };
        },
        i = 0;

    arr1.sort(function(a, b) {
        return results[i++] = fn(a, b);
    });

    for (var k = 2; k < arguments.length; k++) {
        arguments[k].sort(playback());
    }
}

所以这个概念总体上非常简单。只需对第一个数组进行排序,但传递一个包装实际排序函数的函数。

.sort()算法调用包装函数时,它将实际排序函数的结果记录到一个数组中。

然后我们需要做的就是简单地创建另一个函数,作为辅助数组的排序函数传递。这个函数什么都不做,只是读回原始排序的结果,导致发生相同的排序。


你会在你的代码中像这样使用它......

演示:http: //jsfiddle.net/jWg3n/

var obj = {};
obj['aa'] = [5,2,7,0];
obj['bb'] = ['b', 'e', 'f', 'a'];
obj['cc'] = [12, 66, 77, 43];

parallel_sort(function(a,b) { return a - b; },
              obj.aa,
              obj.bb,
              obj.cc
              );


结果看起来像这样......

{
    "aa": [
        0,
        2,
        5,
        7
    ],
    "bb": [
        "a",
        "e",
        "b",
        "f"
    ],
    "cc": [
        43,
        66,
        12,
        77
    ]
}

是主要的obj.aa排序,所以obj.bbobj.cc遵循 的排序obj.aa

于 2012-08-06T19:51:00.243 回答
0

您无法对“对象”进行排序。对于上面的示例,它无法排序。除非您想对对象中的每个数组进行排序,否则可以这样做

// loop through each item in your dataset
for (var i in data) {
    // make sure the item is actually part of dataset and not in herited
    if (data.hasOwnProperty(i)) {
        // sort:
        data[i].sort(function(a,b) {
            return a-b;
        });
    }
}
于 2012-08-06T19:29:02.637 回答