UNPKG

@thi.ng/bidir-index

Version:

Bi-directional index mapping arbitrary keys to numeric IDs & vice versa

38 lines (37 loc) 1.1 kB
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 };