Object/invert.js

const is_object = require('../Assertion/is_object');
const is_array = require('../Assertion/is_array');
const is_defined = require('../Assertion/is_defined');
const is_function = require('../Assertion/is_function');
const throwObjectTypeError = require('../Errors/objectTypeError');

/**
 * Creates an object composed of the inverted keys and values of object.
 * If object contains duplicate values, and subsequent values overwrite property assignments of previous values.
 *
 * @memberof module:Object
 * @param {Object} object The object to invert.
 * @returns {Object} Returns the new inverted object.
 * @throws {TypeError}
 * @example
 * const person = {
 *     fname: 'Stefan',
 *     lname: 'Lazarevic',
 * };
 *
 * object_invert(person);
 * // => {
 * //        Stefan: 'fname',
 * //        Lazarevic: 'lname',
 * //    }
 */
function invert(object) {
    if (is_object(object) || is_array(object)) {
        const invertedObject = {};
        let key;
        for (key in object) {
            /* istanbul ignore next */
            if (object.hasOwnProperty(key)) {
                const value = object[key];
                if (is_defined(value) && !is_function(value)) {
                    invertedObject[value] = key;
                }
            }
        }

        return invertedObject;
    }

    throwObjectTypeError(object);
}

module.exports = invert;