2017-07-28 1 views
0

マージ:JSONオブジェクトから配列から最大の価値を見つけ、私は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をマージしたいです"source"と "target"とkey "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 } 
     }, 

] 

これは一例であり、それは別のオブジェクトとに行くオブジェクト。私はこの問題を解決する方法がわかりません アンダースコアやロダッシュはこの問題を解決するのは簡単だと思っていますが、解決策は何でも受け入れられます。

答えて

1

_.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":"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}}]; 
 

 
var result = _(connections) 
 
    .groupBy(function(o) { // group by source and target 
 
    return o.source + '-' + o.target; 
 
    }) 
 
    .map(function(arr) { // map the groups to values 
 
    return arr.reduce(function(max, o) { // get the object with the hight normal in each group 
 
     return max.metrics.normal > o.metrics.normal ? max : o; 
 
    }); 
 
    }) 
 
    .value(); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

0

あなたは目標に基づいて、新しい配列に配列を減らすことができるとソースが同じであること、そしてメトリックは、以前に格納された値

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} } 
 
] 
 

 
var res = connections.reduce((a,b) => { 
 
    let i = a.findIndex(item => item.target === b.target && item.source === b.source); 
 
    if (i===-1) { 
 
     a.push(b); 
 
    } else if (a[i].metrics.normal < b.metrics.normal) { 
 
     a[i] = b; 
 
    } 
 
    return a; 
 
}, []); 
 

 
document.body.innerHTML = '<pre>' + JSON.stringify(res,0,4) + '</pre>'
以上であるかどうかをチェックします

1

オブジェクトをマップとして使用できます。

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} } 
 
]; 
 

 
var map = {}; 
 
connections.forEach((connection) => { 
 
    var mapKey = connection.source + "/" + connection.target; 
 
    answerConnection = map[mapKey]; 
 

 
    if (!answerConnection || answerConnection.metrics.normal < connection.metrics.normal) 
 
    map[mapKey] = connection; 
 
}); 
 

 
var answer = Object.values(map); 
 

 
console.log(answer);

source + targetの組み合わせ毎に最高のメトリックを有するものを維持 sourceキーおよび値として connectionsの対象として+ target
関連する問題