@voiceflow/common
Version:
Junk drawer of utility functions
73 lines (72 loc) • 2.49 kB
JavaScript
import _isPlainObject from 'lodash/isPlainObject.js';
export { default as shallowEquals } from 'shallowequal';
export const selectField = (field) => (obj) => obj[field];
export const selectID = selectField('id');
export const selectKey = selectField('key');
export const selectValue = selectField('value');
export const isObject = (obj) => obj !== null && typeof obj === 'object';
export const isPlainObject = (obj) => _isPlainObject(obj);
export const hasProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key);
export const omit = (obj, keys) => {
const newObj = { ...obj };
if (keys.length > 3) {
return keys.reduce((acc, key) => {
delete acc[key];
return acc;
}, newObj);
}
delete newObj[keys[0]];
if (keys.length === 1)
return newObj;
delete newObj[keys[1]];
if (keys.length === 2)
return newObj;
delete newObj[keys[2]];
return newObj;
};
export const pick = (obj, keys) => {
const newObj = {};
if (keys.length > 3) {
return keys.reduce((acc, key) => {
if (hasProperty(obj, key)) {
acc[key] = obj[key];
}
return acc;
}, newObj);
}
if (keys.length === 0)
return newObj;
if (hasProperty(obj, keys[0])) {
newObj[keys[0]] = obj[keys[0]];
}
if (keys.length === 1)
return newObj;
if (hasProperty(obj, keys[1])) {
newObj[keys[1]] = obj[keys[1]];
}
if (keys.length === 2)
return newObj;
if (hasProperty(obj, keys[2])) {
newObj[keys[2]] = obj[keys[2]];
}
return newObj;
};
export const pickBy = (obj, predicate) => Object.entries(obj).reduce((acc, [key, value]) => {
if (predicate(key, value)) {
acc[key] = value;
}
return acc;
}, {});
export const omitBy = (obj, predicate) => Object.entries(obj).reduce((acc, [key, value]) => {
if (predicate(key, value)) {
delete acc[key];
}
return acc;
}, { ...obj });
/**
* @deprecated use pickBy instead
*/
export const filterEntries = pickBy;
export const mapEntry = (obj, callback) => Object.fromEntries(Object.entries(obj).map(callback));
export const mapValue = (obj, callback) => Object.fromEntries(Object.entries(obj).map(([key, value]) => [key, callback(value)]));
export const shallowPartialEquals = (obj, partial) => Object.entries(partial).every(([key, partialValue]) => hasProperty(obj, key) && partialValue === obj[key]);