@shopify/polaris
Version:
Shopify’s admin product component library
44 lines (37 loc) • 1.1 kB
text/typescript
function pickValueAndLength(obj: {[key: string]: any}, key: string) {
const keyPaths = key.split('.');
let value = obj;
for (const key of keyPaths) {
if (!Object.prototype.hasOwnProperty.call(value, key)) {
return null;
}
value = value[key];
}
return {keyPaths, value};
}
export function pick(
obj: {[key: string]: any} | null,
...keyPaths: (string | string[])[]
) {
const flattenedKeypaths = ([] as string[]).concat(...keyPaths);
if (obj == null || flattenedKeypaths.length === 0) return {};
return flattenedKeypaths.reduce((acc, key) => {
if (
typeof key !== 'string' ||
Object.prototype.hasOwnProperty.call(obj, key)
) {
return {...acc, [key]: obj[key]};
}
const pickedValues = pickValueAndLength(obj, key);
if (pickedValues === null) {
return acc;
}
const {keyPaths, value} = pickedValues;
let len = keyPaths.length;
let innerObject = {[keyPaths[--len]]: value};
while (len--) {
innerObject = {[keyPaths[len]]: innerObject};
}
return {...acc, ...innerObject};
}, {});
}