@devgrid/common
Version:
Some useful primitives
61 lines • 1.8 kB
JavaScript
import { isNil } from './predicates';
const objectOwnProps = Object.getOwnPropertyNames(Object.getPrototypeOf({}));
const _keys = (obj, enumOnly, followProto) => {
if (!followProto) {
return enumOnly ? Object.keys(obj) : Object.getOwnPropertyNames(obj);
}
const props = [];
const seen = new Set();
const protoChain = [];
let current = obj;
while (current) {
protoChain.unshift(current);
current = Object.getPrototypeOf(current);
}
for (const proto of protoChain) {
const keys = enumOnly ?
Object.keys(proto) :
Object.getOwnPropertyNames(proto);
for (const key of keys) {
if (!seen.has(key) && !objectOwnProps.includes(key)) {
seen.add(key);
props.push(key);
}
}
}
return props;
};
export const keys = (obj, { enumOnly = true, followProto = false, all = false } = {}) => {
if (isNil(obj)) {
return [];
}
if (all) {
enumOnly = false;
followProto = true;
}
return _keys(obj, enumOnly, followProto);
};
export const values = (obj, { enumOnly = true, followProto = false, all = false } = {}) => {
if (isNil(obj)) {
return [];
}
if (all) {
enumOnly = false;
followProto = true;
}
if (!followProto && enumOnly) {
return Object.values(obj);
}
return _keys(obj, enumOnly, followProto).map(key => obj[key]);
};
export const entries = (obj, { enumOnly = true, followProto = false, all = false } = {}) => {
if (isNil(obj)) {
return [];
}
if (all) {
enumOnly = false;
followProto = true;
}
return _keys(obj, enumOnly, followProto).map(key => [key, obj[key]]);
};
//# sourceMappingURL=entries.js.map