繁体   English   中英

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

[英]Javascript sort an object with parallel arrays

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

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()算法调用时,它将实际排序函数的结果记录到Array中。

然后,我们要做的只是简单地创建另一个函数,该函数作为辅助数组的排序函数传递。 该函数除了读取原始排序的结果外什么也不做,从而导致相同的排序发生。


您可以在代码中像这样使用它...

演示: 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

您无法对“对象”进行排序。 上面的示例无法对其进行排序。 除非您要对对象中的每个数组进行排序,否则将这样做

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM