Javascript 从数组中查找JSON对象的最大值并合并它们
我是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"
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.normal document.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.normal document.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;
应答连接=映射