Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过按相同id添加对象值,同时添加唯一id,合并两个对象数组_Javascript_Arrays_Array Merge - Fatal编程技术网

Javascript 通过按相同id添加对象值,同时添加唯一id,合并两个对象数组

Javascript 通过按相同id添加对象值,同时添加唯一id,合并两个对象数组,javascript,arrays,array-merge,Javascript,Arrays,Array Merge,我有一个工作函数,它在三种情况下合并两个长度不同的对象数组(源>目标): 包括目标阵列中具有唯一id的对象 包括源阵列中具有唯一id的对象 通过从源值中减去目标值,包括具有重复ID的对象 我的问题是,我如何才能将此代码更改为更精简、更高效的代码? 只要看一下代码,就好像需要很多计算资源 我试图对数组进行concat并通过while循环运行它们,但无法找出区分哪个对象属于哪个数组的方法 让目标=[ {id:1,x:50}, {id:2,x:30}, {id:3,x:30} ]; 让源=[ {id

我有一个工作函数,它在三种情况下合并两个长度不同的对象数组(源>目标):

  • 包括目标阵列中具有唯一id的对象
  • 包括源阵列中具有唯一id的对象
  • 通过从源值中减去目标值,包括具有重复ID的对象
  • 我的问题是,我如何才能将此代码更改为更精简、更高效的代码? 只要看一下代码,就好像需要很多计算资源

    我试图对数组进行concat并通过while循环运行它们,但无法找出区分哪个对象属于哪个数组的方法

    让目标=[
    {id:1,x:50},
    {id:2,x:30},
    {id:3,x:30}
    ];
    让源=[
    {id:1,x:30},
    {id:2,x:13},
    {id:4,x:100},
    {id:5,x:5}
    ];
    设arrayResult=[];
    函数计算(目标、源){
    for(设i=0;id.id==srcObj.id)
    if(tarObj){
    让结果={
    id:srcObj.id,
    x:srcObj.x-tarObj.x
    }
    arrayResult.push(结果);
    }否则{
    arrayResult.push(srcObj);
    }
    }
    for(设i=0;id.id==src.id);
    如果(!焦油){
    arrayResult.push(src)
    }
    }
    }
    计算(目标、源);
    
    console.log(arrayResult)
    您可以通过在
    source
    中生成一个数组映射
    id
    值到它们在数组中的索引来提高效率。然后您可以迭代
    target
    ,检查每个对象
    id
    值是否在
    srcids
    数组中有条目,如果有,则更新相应的
    source
    x
    值,否则将对象推入
    数组:

    让目标=[
    {id:1,x:50},
    {id:2,x:30},
    {id:3,x:30}
    ];
    让源=[
    {id:1,x:30},
    {id:2,x:13},
    {id:4,x:100},
    {id:5,x:5}
    ];
    const srcids=source.reduce((c,o,i)=>{
    c[o.id]=i;
    返回c;
    }, []);
    target.forEach(o=>{
    if(srcids[o.id]!==未定义){
    源[srcids[o.id]].x-=o.x;
    }否则{
    源推送(o);
    }
    });
    
    console.log(源代码)
    您可以通过在
    source
    中生成一个数组映射
    id
    值到它们在数组中的索引来提高效率。然后您可以迭代
    target
    ,检查每个对象
    id
    值是否在
    srcids
    数组中有条目,如果有,则更新相应的
    source
    x
    值,否则将对象推入
    数组:

    让目标=[
    {id:1,x:50},
    {id:2,x:30},
    {id:3,x:30}
    ];
    让源=[
    {id:1,x:30},
    {id:2,x:13},
    {id:4,x:100},
    {id:5,x:5}
    ];
    const srcids=source.reduce((c,o,i)=>{
    c[o.id]=i;
    返回c;
    }, []);
    target.forEach(o=>{
    if(srcids[o.id]!==未定义){
    源[srcids[o.id]].x-=o.x;
    }否则{
    源推送(o);
    }
    });
    
    console.log(源代码);
    Wow Nick。打开了我对数组的新视角:-)Wow Nick。让我看到了阵列的新视角:-)