Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.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 基于对象数组中的其他值计算对象数组中的值_Javascript_Jquery_Arrays_Object_Ecmascript 6 - Fatal编程技术网

Javascript 基于对象数组中的其他值计算对象数组中的值

Javascript 基于对象数组中的其他值计算对象数组中的值,javascript,jquery,arrays,object,ecmascript-6,Javascript,Jquery,Arrays,Object,Ecmascript 6,我有一个这样的对象数组: let data = [ {date:'2020-05-01', device: 'iphone', site: 'google', val1:10, val2:20, val3:30}, {date:'2020-05-01', device: 'iphone', site: 'bing', val1:23, val2:12, val3:14}, {date:'2020-05-01', device: 'iphone',

我有一个这样的对象数组:

    let data = [
    {date:'2020-05-01', device: 'iphone',   site: 'google', val1:10, val2:20, val3:30},
    {date:'2020-05-01', device: 'iphone',   site: 'bing',   val1:23, val2:12, val3:14},
    {date:'2020-05-01', device: 'iphone',   site: 'jeeves', val1:67, val2:78, val3:12},
    {date:'2020-05-03', device: 'iphone',   site: 'google', val1:10, val2:20, val3:30},
    {date:'2020-05-03', device: 'iphone',   site: 'bing',   val1:23, val2:12, val3:14},
    {date:'2020-05-03', device: 'iphone',   site: 'jeeves', val1:67, val2:78, val3:12}
    ];
我想用
2020-05-01
2020-05-03
中减去VAL,当
站点
相同时,最后返回如下内容:

    [
    {device: 'iphone',   site: 'google', val1:-5, val2:5, val3:15},
    {device: 'iphone',   site: 'bing',   val1:10, val2:-10, val3:53},
    {device: 'iphone',   site: 'jeeves', val1:10, val2:21, val3:13},
    ]
我试着为每个人做一个
forEach
,但我真的不确定从哪里开始,以及如何编写一个函数以使其更易于重用:

    
    data.forEach(d => {
        if (d.data === )
    });

很抱歉,我真的不知道从这里到哪里去,这就是为什么我真的无法显示我尝试了什么。

您可以使用嵌套循环来实现这一点。在第一个循环中循环相同的数组,检查两个对象是否具有相同的位置,然后减去值。可以将结果对象推入另一个数组并返回该数组

    //in your case it will be like this:
    const SubtractValues = (data) => {
      let resultarr = [];  
      data.forEach(d => {
            data.forEach(d2 => {
              //if both objects have same site and they are not the same object
              if(d2.site == d.site && d != d2){
                let result = {device: d.device, site: d.site, val1: d2.val1 - d.val1, val2: d2.val2 - d.val2, val3: d2.val3 - d.val3}
                //if result with same site is not already present in the results array
                if(!(resultarr.some(item => item.site === result.site))){
                  resultarr.push(result)
                }
              }
            })
        });
      return resultarr;
    }