UNPKG

lib0

Version:

> Monorepo of isomorphic utility functions

140 lines (125 loc) 2.76 kB
/** * Utility functions for working with EcmaScript objects. * * @module object */ /** * @return {Object<string,any>} obj */ export const create = () => Object.create(null) /** * Object.assign */ export const assign = Object.assign /** * @param {Object<string,any>} obj */ export const keys = Object.keys /** * @template V * @param {{[k:string]:V}} obj * @param {function(V,string):any} f */ export const forEach = (obj, f) => { for (const key in obj) { f(obj[key], key) } } /** * @todo implement mapToArray & map * * @template R * @param {Object<string,any>} obj * @param {function(any,string):R} f * @return {Array<R>} */ export const map = (obj, f) => { const results = [] for (const key in obj) { results.push(f(obj[key], key)) } return results } /** * @deprecated use object.size instead * @param {Object<string,any>} obj * @return {number} */ export const length = obj => keys(obj).length /** * @param {Object<string,any>} obj * @return {number} */ export const size = obj => keys(obj).length /** * @param {Object<string,any>} obj * @param {function(any,string):boolean} f * @return {boolean} */ export const some = (obj, f) => { for (const key in obj) { if (f(obj[key], key)) { return true } } return false } /** * @param {Object|undefined} obj */ export const isEmpty = obj => { // eslint-disable-next-line for (const _k in obj) { return false } return true } /** * @param {Object<string,any>} obj * @param {function(any,string):boolean} f * @return {boolean} */ export const every = (obj, f) => { for (const key in obj) { if (!f(obj[key], key)) { return false } } return true } /** * Calls `Object.prototype.hasOwnProperty`. * * @param {any} obj * @param {string|symbol} key * @return {boolean} */ export const hasProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key) /** * @param {Object<string,any>} a * @param {Object<string,any>} b * @return {boolean} */ export const equalFlat = (a, b) => a === b || (size(a) === size(b) && every(a, (val, key) => (val !== undefined || hasProperty(b, key)) && b[key] === val)) /** * Make an object immutable. This hurts performance and is usually not needed if you perform good * coding practices. */ export const freeze = Object.freeze /** * Make an object and all its children immutable. * This *really* hurts performance and is usually not needed if you perform good coding practices. * * @template {any} T * @param {T} o * @return {Readonly<T>} */ export const deepFreeze = (o) => { for (const key in o) { const c = o[key] if (typeof c === 'object' || typeof c === 'function') { deepFreeze(o[key]) } } return freeze(o) }