function mapEntry(fnValue, fnKey, thisObj) {
  const res = {};
  for (let key of Object.keys(this)) {
    const val = this[key];
    if (!fnKey || (key = thisObj::fnKey(key, val, this))) {
      res[key] = fnValue ? thisObj::fnValue(val, key, this) : val;
    }
  }
  return res;
}
@param {function} [fnValue] - (value, newKey, obj) => newValue
@param {function} [fnKey] - (key, val, obj) => newKey (if newKey is falsy the key is skipped)
@param {Object} [thisObj] - passed as `this` to both functions
@return {Object}