(function() { // helper to get the name of an enum from one of its valuesObj[k] == value) || "INVALID_ENUM_VALUE"; Object.defineProperty(Object.prototype, 'keyName', { enumerable: false, value: function(value) { return Object.keys(this).find(k => this[k] == value) || "INVALID_ENUM_VALUE"; } }); // helper to map over an object's keys recursively Object.defineProperty(Object.prototype, 'mapKey', { enumerable: false, value: function(keyName, mapFunc) { let ret = {}; for (let k in this) { if (k == keyName) { ret[k] = mapFunc(this[k]); } else if (typeof(this[k]) == 'object') { ret[k] = { ...this[k] }.mapKey(keyName, mapFunc); } else { ret[k] = this[k]; } } return ret; } }); console.format = v => console.dir(v, { depth: null }); })();