JSFiddle - React, Tailwind, and code Playground
JavaScript
var array1 = [{
"id": 24006,
"iso3": "AFG",
"country": "Afghanistan",
"year": 2014,
"value": 29.78
}, {
"id": 138806,
"iso3": "ALB",
"country": "Albania",
"year": 2013,
"value": 0.6341109715
}, {
"id": 44206,
"iso3": "DZA",
"country": "Algeria",
"year": 2014,
"value": 39.928947
}]
var array2 = [{
"indicator_id": 21806,
"footnote_id": 64811,
"iso3": "AFG",
"year": 2014
}, {
"indicator_id": 23806,
"footnote_id": 15711,
"iso3": "AFG",
"year": 2013
}, {
"indicator_id": 123406,
"footnote_id": 15711,
"iso3": "ALB",
"year": 2013
}, {
"indicator_id": 101606,
"footnote_id": 48911,
"iso3": "DZA",
"year": 2013
}];
var merge = function (o1, o2) {
var result = {};
for (var a in o1) {
result[a] = o1[a];
}
for (var a in o2) {
result[a] = o2[a];
}
return result;
}
var compareByIsoAndYear = function (o1, o2) {
if (o1.iso3 === o2.iso3 && o1.year === o2.year) return 0
else if (o1.year > o2.year) return 1
else if (o1.year < o2.year) return -1
else if (o1.iso3 > o2.iso3) return 1;
}
var mergeTwoObjects = function (initial, current) {
if (initial.length > 0) {
var last = initial[initial.length - 1];
if (compareByIsoAndYear(last, current) === 0) {
initial[initial.length - 1] = merge(last, current);
return initial;
}
}
initial.push(current);
return initial;
}
var result = array1.concat(array2)
.sort(compareByIsoAndYear)
.reduce(mergeTwoObjects, []);
console.log(JSON.stringify(result));