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));