我正在寻找一种高性能方法来对两个数组之间互斥的值进行零填充。此数据适用于 JS 图表,该图表必须包含每个 x 值的条目。 一个例子可以更好地解释这一点:
之前:
obj1 = [{x:1, y:1}, {x:3, y:2}];
obj2 = [{x:2, y:2}, {x:4, y:4}];
之后:
obj1 = [{x:1, y:1}, {x: 2, y:0}, {x:3, y:2}, {x:4, y:0}];
obj2 = [{x:1, y:0}, {x: 2, y:2}, {x:3, y:0}, {x:4, y:4}];
我自己使用嵌套 for 循环来完成此操作,但随着对象和条目数量的增加,挂壁时间变得令人无法接受。在最终零填充到总共几千个条目的数据集中,墙上时间超过 10 秒。
我查看了一些 JS 库,例如 jQuery 和 underscore,但不清楚它们是否有更好的执行功能。
更新:感谢您的所有回复。我会尝试一下,并将表现最好的标记为答案。 关于 x 值的注释:它们不一定单调递增(obj1 和 2 可以跳过 x 值,只要它们都这样做)。 x 轴不一定是数字,也可以是日期。希望一个或多个答案能够适应这一点。
最佳答案
基本上创建所有值的散列,以及每个对象中所有值的散列。然后用“all”散列中不存在于“individual”散列中的散列填充对象
// hash of unique x values
var xValues = {};
// store each distinct x value
walk( obj1, 'obj1' );
walk( obj2, 'obj2' );
// fill each array with missing values
fill( obj1, 'obj1' );
fill( obj2, 'obj2' );
function walk( obj, nm ){
xValues[ nm ] || ( xValues[ nm ] = {} );
xValues.all || ( xValues.all = {} );
for( var i=0, l=obj.length; i<l; i++ ){
xValues[ nm ][ obj[ i ].x ] = 1;
xValues.all [ obj[ i ].x ] = 1;
}
}
function fill( obj, nm ){
for( var key in xValues.all ){
if( !( key in xValues[ nm ] ) ){
obj.push( { x : key, y : 0 } );
}
}
}
关于Javascript:填充数组之间的缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21200477/