Javascript:填充数组之间的缺失值

标签 javascript arrays

我正在寻找一种高性能方法来对两个数组之间互斥的值进行零填充。此数据适用于 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/

相关文章:

javascript - 如何按键提取数组并对其进行分组

php - 如何连接两个数组键?

java - 如何从 int[] 数组打印最长的数字序列 (Java)

C、如何将数组中的数字拆分为 int

javascript - 使用 jQuery 获取花括号中的无效 HTML 代码

javascript - Uncaught Error : [HMR] Hot Module Replacement is disabled

Javascript/jquery 附加一个带有字符串的变量

javascript - 使用moment JS计算准确的时间差

python - NumPy 中的逐元素矩阵乘法

PHP append 一个带有额外Mysql查询的数组