map-transform
Version:
Map and transform objects with mapping definitions
48 lines • 1.4 kB
JavaScript
import { isObject } from '../utils/is.js';
import { revFromState } from '../utils/stateHelpers.js';
const isExplodedArray = (data) => data.length > 0 &&
data.every((item) => isObject(item) && typeof item.key === 'number');
const setValueOnKey = (target, keyValue) => {
if (isObject(keyValue)) {
const { key, value } = keyValue;
if (Array.isArray(target)) {
target[key] = value;
}
else {
target[String(key)] = value;
}
}
return target;
};
function doImplode(data) {
if (Array.isArray(data)) {
return data.reduce(setValueOnKey, isExplodedArray(data)
? []
: {});
}
else {
return undefined;
}
}
function doExplode(data) {
if (isObject(data)) {
return Object.entries(data)
.filter(([, value]) => value !== undefined)
.map(([key, value]) => ({
key,
value,
}));
}
else if (Array.isArray(data)) {
return data.map((value, key) => ({ key, value }));
}
else {
return undefined;
}
}
function explodeOrImplode(isImplode) {
return () => () => async (data, state) => revFromState(state, isImplode) ? doImplode(data) : doExplode(data);
}
export const explode = explodeOrImplode(false);
export const implode = explodeOrImplode(true);
//# sourceMappingURL=explode.js.map