Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.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 从数组中查找JSON对象的最大值并合并它们_Javascript_Jquery_Json_Underscore.js_Lodash - Fatal编程技术网

Javascript 从数组中查找JSON对象的最大值并合并它们

Javascript 从数组中查找JSON对象的最大值并合并它们,javascript,jquery,json,underscore.js,lodash,Javascript,Jquery,Json,Underscore.js,Lodash,我是javascript新手,我有一个JSON数组,其中包含一些重复键,如下所示: var connections = [ { "source":"l1", "target":"l2", "metrics": { "normal":20 }, "metadata": { "streaming": 1 } }, { "source":"l2", "target":"l3", "metrics"

我是javascript新手,我有一个JSON数组,其中包含一些重复键,如下所示:

var connections = [

  {
      "source":"l1",
      "target":"l2",
      "metrics": { "normal":20  },
      "metadata": { "streaming": 1 }
    },
   {
      "source":"l2",
      "target":"l3",
      "metrics": { "normal":30  },
      "metadata": { "streaming": 1 }
    },

    {
      "source":"l2",
      "target":"l3",
      "metrics": { "normal":25  },
      "metadata": { "streaming": 1 }
    },
    {
      "source":"l3",
      "target":"l4",
      "metrics": { "normal":24  },
      "metadata": { "streaming": 1 }
    },
    {
      "source":"l3",
      "target":"l4",
      "metrics": { "normal":21  },
      "metadata": { "streaming": 1 }
    },
    {
      "source":"l3",
      "target":"l4",
      "metrics": { "normal":20  },
      "metadata": { "streaming": 1 }
    },


]
现在我想合并具有相同“源”和“目标”值的重复JSON,键“normal”应该是所有相同源和目标的最大值。 因此,给定示例的答案将是:

var answer =[
{
          "source":"l1",
          "target":"l2",
          "metrics": { "normal":20  },
          "metadata": { "streaming": 1 }
        },
       {
          "source":"l2",
          "target":"l3",
          "metrics": { "normal":30  },
          "metadata": { "streaming": 1 }
        },
        {
          "source":"l3",
          "target":"l4",
          "metrics": { "normal":24  },
          "metadata": { "streaming": 1 }
        },

] 
这只是一个示例对象,它使用不同的对象。我不知道如何解决这个问题, 我认为下划线或lodash可以很容易地解决这个问题,但任何一种解决方案都是可以接受的。

使用
\u.groupBy()
按对象的源和目标收集对象。使用
.map()
和Array#reduce获得每组中
normal
值最大的值

var connections=[{“source”:“l1”,“target”:“l2”,“metrics”:{“normal”:20},“metadata”:{“streaming”:1},{“source”:“l2”,“target”:“l3”,“metrics”:{“normal”:30},“metadata”:{“streaming”:1},{“source”:“streaming”:24},{“streaming”:“target,{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:21},“元数据”:{“流”:1}},{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:20},“元数据”:{“流”:1}};
var结果=(连接数)
.groupBy(函数(o){//按源和目标分组
返回o.source+'-'+o.target;
})
.map(函数(arr){//将组映射到值
返回arr.reduce(函数(max,o){//获取每组中具有高法线的对象
返回max.metrics.normal>o.metrics.normal?max:o;
});
})
.value();
console.log(结果);
使用
.groupBy()
按对象的源和目标收集对象。使用
.map()
和数组#reduce可获得每组中具有最大
正常值的对象

var connections=[{“source”:“l1”,“target”:“l2”,“metrics”:{“normal”:20},“metadata”:{“streaming”:1},{“source”:“l2”,“target”:“l3”,“metrics”:{“normal”:30},“metadata”:{“streaming”:1},{“source”:“streaming”:24},{“streaming”:“target,{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:21},“元数据”:{“流”:1}},{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:20},“元数据”:{“流”:1}};
var结果=(连接数)
.groupBy(函数(o){//按源和目标分组
返回o.source+'-'+o.target;
})
.map(函数(arr){//将组映射到值
返回arr.reduce(函数(max,o){//获取每组中具有高法线的对象
返回max.metrics.normal>o.metrics.normal?max:o;
});
})
.value();
console.log(结果);

您可以基于目标和源相同,将数组缩减为新数组,然后检查度量值是否大于先前存储的值

var连接=[
{“源”:“l1”,“目标”:“l2”,“度量”:{“正常”:20},“元数据”:{“流”:1},
{“源”:“l2”,“目标”:“l3”,“度量”:{“正常”:30},“元数据”:{“流”:1}},
{“源”:“l2”,“目标”:“l3”,“度量”:{“正常”:25},“元数据”:{“流”:1},
{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:24},“元数据”:{“流”:1}},
{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:21},“元数据”:{“流”:1}},
{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:20},“元数据”:{“流”:1}}
]
var res=连接。减少((a,b)=>{
设i=a.findIndex(item=>item.target==b.target&&item.source==b.source);
如果(i==-1){
a、 推(b);
}else if(a[i].metrics.normaldocument.body.innerHTML=''+JSON.stringify(res,0,4)+''
您可以根据目标和源相同的情况将数组缩减为新数组,然后检查度量是否大于先前存储的值

var连接=[
{“源”:“l1”,“目标”:“l2”,“度量”:{“正常”:20},“元数据”:{“流”:1},
{“源”:“l2”,“目标”:“l3”,“度量”:{“正常”:30},“元数据”:{“流”:1}},
{“源”:“l2”,“目标”:“l3”,“度量”:{“正常”:25},“元数据”:{“流”:1},
{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:24},“元数据”:{“流”:1}},
{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:21},“元数据”:{“流”:1}},
{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:20},“元数据”:{“流”:1}}
]
var res=连接。减少((a,b)=>{
设i=a.findIndex(item=>item.target==b.target&&item.source==b.source);
如果(i==-1){
a、 推(b);
}else if(a[i].metrics.normaldocument.body.innerHTML=''+JSON.stringify(res,0,4)+''
您可以使用对象作为映射,将
源代码+
目标作为键,将
连接的对象作为值,为
源代码+
目标的每个组合保留具有最高度量的对象:

var连接=[
{“源”:“l1”,“目标”:“l2”,“度量”:{“正常”:20},“元数据”:{“流”:1},
{“源”:“l2”,“目标”:“l3”,“度量”:{“正常”:30},“元数据”:{“流”:1}},
{“源”:“l2”,“目标”:“l3”,“度量”:{“正常”:25},“元数据”:{“流”:1},
{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:24},“元数据”:{“流”:1}},
{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:21},“元数据”:{“流”:1}},
{“源”:“l3”,“目标”:“l4”,“度量”:{“正常”:20},“元数据”:{“流”:1}}
];
var-map={};
connections.forEach((连接)=>{
var mapKey=connection.source+“/”+connection.target;
应答连接=映射