react-uid
Version:
Render-less container for ID generation
42 lines (41 loc) • 957 B
JavaScript
/**
* generates a UID factory
* @internal
* @example
* const uid = generateUID();
* uid(object) = 1;
* uid(object) = 1;
* uid(anotherObject) = 2;
*/
export const generateUID = () => {
let counter = 1;
const map = new WeakMap();
/**
* @borrows {uid}
*/
const uid = (item, index) => {
if (typeof item === 'number' || typeof item === 'string') {
return index ? `idx-${index}` : `val-${item}`;
}
if (!map.has(item)) {
map.set(item, counter++);
return uid(item);
}
return 'uid' + map.get(item);
};
return uid;
};
/**
* @name uid
* returns an UID associated with {item}
* @param {Object} item - object to generate UID for
* @param {Number} index, a fallback index
* @example
* uid(object) == 1;
* uid(object) == 1;
* uid(anotherObject) == 2;
* uid("not object", 42) == 42
*
* @see {@link useUID}
*/
export const uid = generateUID();