UNPKG

@toolpad/utils

Version:

Shared utilities used by Toolpad packages.

63 lines (55 loc) 2.19 kB
export function asArray(maybeArray) { return Array.isArray(maybeArray) ? maybeArray : [maybeArray]; } /** * Type aware version of Object.protoype.hasOwnProperty. * See https://fettblog.eu/typescript-hasownproperty/ */ export function hasOwnProperty(obj, prop) { return obj.hasOwnProperty(prop); } /** * Maps `obj` to a new object. The `mapper` function receives an entry array of key and value and * is allowed to manipulate both. It can also return `null` to omit a property from the result. */ export function mapProperties(obj, mapper) { return Object.fromEntries(Object.entries(obj).flatMap(entry => { const mapped = mapper(entry); return mapped ? [mapped] : []; })); } /** * Maps an objects' property keys. The result is a new object with the mapped keys, but the same values. */ export function mapKeys(obj, mapper) { return mapProperties(obj, ([key, value]) => [mapper(key), value]); } /** * Maps an objects' property values. The result is a new object with the same keys, but mapped values. */ export function mapValues(obj, mapper) { return mapProperties(obj, ([key, value]) => [key, mapper(value, key)]); } /** * Filters an objects' property values. Similar to `array.filter` but for objects. The result is a new * object with all the properties removed for which `filter` returned `false`. */ export function filterValues(obj, filter) { return mapProperties(obj, ([key, value]) => filter(value) ? [key, value] : null); } /** * Filters an objects' property keys. Similar to `array.filter` but for objects. The result is a new * object with all the properties removed for which `filter` returned `false`. */ export function filterKeys(obj, filter) { return mapProperties(obj, ([key, value]) => filter(key) ? [key, value] : null); } /** * Compares the properties of two objects. Returns `true` if all properties are strictly equal, `false` * otherwise. * Pass a subset of properties to only compare those. */ export function equalProperties(obj1, obj2, subset) { const keysToCheck = new Set(subset ?? [...Object.keys(obj1), ...Object.keys(obj2)]); return Array.from(keysToCheck).every(key => Object.is(obj1[key], obj2[key])); }