javascript - Find maximum value from JSON objects from array and Merge them -
i new javascript , have json array contains duplicate keys below:
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 } }, ] now want merge duplicate json has same value of "source" , "target" , key "normal" should maximum of same source , target. answer given example be:
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 } }, ] this example object goes on different objects. don't know how solve problem, think underscore or lodash can easy solve problem knid of solution accepted.
use _.groupby() collect objects source , target. use _.map() , array#reduce 1 maximum normal value in each group.
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 source , target return o.source + '-' + o.target; }) .map(function(arr) { // map groups values return arr.reduce(function(max, o) { // object 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>
Comments
Post a Comment