FilterJSON Collection

How to filter down distinct properties and their distinct values from a collection of objects.

by neneaaglaia

HTML

<div id="myResults">
</div>

JavaScript

function filterJSON(collection) {
  let result = {};
  collection.forEach(obj => {
    Object.keys(obj).sort().forEach(key => {
      if (!result[key]) result[key] = new Set();
      result[key].add(obj[key]);
    });
  });
  Object.keys(result).forEach(key => {
    result[key] = [...result[key]].sort();
  });
  return result;
}

		function renderJSON(obj) {
			var keys = [];
			var objIsArray = Array.isArray(obj); // check if [..] array. Otherwise, it is an ordinary {..} object
			jsonText = "";
			for (var key in obj) {
					if (typeof obj[key] === 'object') {
							if (objIsArray === false) { jsonText += "<li><a href='#'>" + key + "</a><ul>"; }
							jsonText += renderJSON(obj[key]);
							if (objIsArray === false) { jsonText += "</ul></li>"; }
					} else { // obj[key] not object, e.g. just a number or string, or empty
						if (objIsArray === false) {
							jsonText += "<li><a href='#'>" + key;
							if (obj[key]) { jsonText += ": " + obj[key]; }
							jsonText += "</a></li>";
						} else {
							jsonText += "<li><a href='#'>";
							if (obj[key]) { jsonText += obj[key]; } else { jsonText += "(empty)"; }
							jsonText += "</a></li>";
						}
					}

					keys.push(key);
			}
			return jsonText;
	  }



let sample = [
  {a: 1, b: 2},
  {a: 3, c: 4},
  {b: 5, c: 6}
];

let result = filterJSON(sample);

let resultElement = document.getElementById("myResults");
resultElement.innerHTML = renderJSON(result);


console.log(result);