Javascript 使用并行数组对对象进行排序

标签 javascript

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

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;});

但这行不通。这显然是错误的。请帮忙。谢谢。

最佳答案

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

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.

关于Javascript 使用并行数组对对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11834536/

相关文章:

javascript - 使用 jquery 验证多次上传的文件大小

javascript - 在 iPhone Safari 中使用 ScriptProcessorNode

javascript - 在 iframe 中使用 document.write 作为脚本时 Chrome 中的奇怪行为

javascript - 适用于移动应用程序的 Node.js Web 服务

javascript - 按键在 chrome 中工作,但在 firefox 中不工作

javascript - 停止 extract-css-chunks-webpack-plugin 组合所有 CSS

javascript - simpleCart js 缩略图图像未定义

javascript - 创建一个带自动移动的旋转木马 - 一直使用时间/暂停的问题

php - int((0.1+0.7)*10) = 7 在多种语言中。如何防止这种情况?

javascript - d3.js v4,我如何在鼠标悬停时有一条线跟随鼠标,但也有一个圆圈跟随路径?