diff options
| author | alpadev <[email protected]> | 2021-03-02 15:55:44 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-03-02 16:55:44 +0200 |
| commit | 48a95f7280735d6f8962fe8b17975b03e351710c (patch) | |
| tree | ce88821218c34186f610929525b34015885ba23c /js/src/dom/data.js | |
| parent | 6d93a1371a7edb823f7d625c6f4489f37c06aac1 (diff) | |
| download | bootstrap-48a95f7280735d6f8962fe8b17975b03e351710c.tar.xz bootstrap-48a95f7280735d6f8962fe8b17975b03e351710c.zip | |
refactor: use a Map instead of an Object in dom/data (#32180)
Co-authored-by: XhmikosR <[email protected]>
Co-authored-by: Rohit Sharma <[email protected]>
Diffstat (limited to 'js/src/dom/data.js')
| -rw-r--r-- | js/src/dom/data.js | 80 |
1 files changed, 35 insertions, 45 deletions
diff --git a/js/src/dom/data.js b/js/src/dom/data.js index c93a8dc7c..1d283d68b 100644 --- a/js/src/dom/data.js +++ b/js/src/dom/data.js @@ -11,57 +11,47 @@ * ------------------------------------------------------------------------ */ -const mapData = (() => { - const storeData = {} - let id = 1 - return { - set(element, key, data) { - if (typeof element.bsKey === 'undefined') { - element.bsKey = { - key, - id - } - id++ - } +const elementMap = new Map() - storeData[element.bsKey.id] = data - }, - get(element, key) { - if (!element || typeof element.bsKey === 'undefined') { - return null - } - - const keyProperties = element.bsKey - if (keyProperties.key === key) { - return storeData[keyProperties.id] - } +export default { + set(element, key, instance) { + if (!elementMap.has(element)) { + elementMap.set(element, new Map()) + } - return null - }, - delete(element, key) { - if (typeof element.bsKey === 'undefined') { - return - } + const instanceMap = elementMap.get(element) - const keyProperties = element.bsKey - if (keyProperties.key === key) { - delete storeData[keyProperties.id] - delete element.bsKey - } + // make it clear we only want one instance per element + // can be removed later when multiple key/instances are fine to be used + if (!instanceMap.has(key) && instanceMap.size !== 0) { + // eslint-disable-next-line no-console + console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`) + return } - } -})() -const Data = { - setData(instance, key, data) { - mapData.set(instance, key, data) + instanceMap.set(key, instance) }, - getData(instance, key) { - return mapData.get(instance, key) + + get(element, key) { + if (elementMap.has(element)) { + return elementMap.get(element).get(key) || null + } + + return null }, - removeData(instance, key) { - mapData.delete(instance, key) + + remove(element, key) { + if (!elementMap.has(element)) { + return + } + + const instanceMap = elementMap.get(element) + + instanceMap.delete(key) + + // free up element references if there are no instances left for an element + if (instanceMap.size === 0) { + elementMap.delete(element) + } } } - -export default Data |
