From 616a8777727d1cbb8ac7ff2b2bd1ea0c3031c256 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Mon, 15 Feb 2021 23:15:58 +0200 Subject: [PATCH] perf: resolveObjectKey (#8434) * perf: resolveObjectKey * Fix tests * prevent string construction --- src/helpers/helpers.core.js | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/helpers/helpers.core.js b/src/helpers/helpers.core.js index 20c0f6e3b..159c1335c 100644 --- a/src/helpers/helpers.core.js +++ b/src/helpers/helpers.core.js @@ -283,22 +283,26 @@ export function _deprecated(scope, value, previous, current) { } } +const emptyString = ''; +const dot = '.'; +function indexOfDotOrLength(key, start) { + const idx = key.indexOf(dot, start); + return idx === -1 ? key.length : idx; +} + export function resolveObjectKey(obj, key) { - // Special cases for `x` and `y` keys. It's quite a lot faster to aceess this way. - // Those are the default keys Chart.js is resolving, so it makes sense to be fast. - if (key === 'x') { - return obj.x; + if (key === emptyString) { + return obj; } - if (key === 'y') { - return obj.y; - } - const keys = key.split('.'); - for (let i = 0, n = keys.length; i < n && obj; ++i) { - const k = keys[i]; - if (!k) { + let pos = 0; + let idx = indexOfDotOrLength(key, pos); + while (idx > pos) { + obj = obj[key.substr(pos, idx - pos)]; + if (!obj) { break; } - obj = obj[k]; + pos = idx + 1; + idx = indexOfDotOrLength(key, pos); } return obj; }