@thi.ng/bidir-index
Version:
Bi-directional index mapping arbitrary keys to numeric IDs & vice versa
38 lines (37 loc) • 1.1 kB
JavaScript
const encodeObject = (index, obj, defaultValue, indexKeys = true) => {
const keys = Object.keys(obj);
const ids = indexKeys ? index.addAll(keys) : index.getAll(keys);
const res = new Array(index.size).fill(defaultValue);
for (let id of ids) {
const val = obj[index.getID(id)];
if (val != null) res[id] = val;
}
return res;
};
const encodeObjectIterator = function* (index, objects, defaultValue, indexKeys = true) {
if (indexKeys) {
for (let o of objects) index.addAll(Object.keys(o));
}
for (let o of objects) {
yield* encodeObject(index, o, defaultValue, false);
}
};
const decodeObject = (index, values, defaults) => {
const res = {};
for (let [k, id] of index) {
const val = values[id] ?? defaults?.[k];
if (val != null) res[k] = val;
}
return res;
};
function* decodeObjectIterator(index, values, size, defaults) {
for (let i = 0, num = values.length; i < num; i += size) {
yield decodeObject(index, values.slice(i, i + size), defaults);
}
}
export {
decodeObject,
decodeObjectIterator,
encodeObject,
encodeObjectIterator
};