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