From 678985ff3ba7acae588d9392f504699fac14e234 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Fri, 12 Feb 2021 10:42:52 +0200 Subject: [PATCH 1/3] perf: resolveObjectKey --- src/helpers/helpers.core.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/helpers/helpers.core.js b/src/helpers/helpers.core.js index 20c0f6e3bdf..007eb95b71b 100644 --- a/src/helpers/helpers.core.js +++ b/src/helpers/helpers.core.js @@ -283,22 +283,24 @@ export function _deprecated(scope, value, previous, current) { } } +function indexOfDotOrLength(key, start) { + const idx = key.indexOf('.', 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 === 'y') { - return obj.y; + if (!key) { + return obj; } - 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; } From 067791e72de8e6b38aa2b52e9408f65a2912c322 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Mon, 15 Feb 2021 22:34:27 +0200 Subject: [PATCH 2/3] Fix tests --- src/helpers/helpers.core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/helpers.core.js b/src/helpers/helpers.core.js index 007eb95b71b..5f36dd57289 100644 --- a/src/helpers/helpers.core.js +++ b/src/helpers/helpers.core.js @@ -289,7 +289,7 @@ function indexOfDotOrLength(key, start) { } export function resolveObjectKey(obj, key) { - if (!key) { + if (key === '') { return obj; } let pos = 0; From 1f38eb103ca3dd7dab5e1c9d9cb14844f3f153e9 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Mon, 15 Feb 2021 22:43:00 +0200 Subject: [PATCH 3/3] prevent string construction --- src/helpers/helpers.core.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/helpers/helpers.core.js b/src/helpers/helpers.core.js index 5f36dd57289..159c1335c4c 100644 --- a/src/helpers/helpers.core.js +++ b/src/helpers/helpers.core.js @@ -283,13 +283,15 @@ export function _deprecated(scope, value, previous, current) { } } +const emptyString = ''; +const dot = '.'; function indexOfDotOrLength(key, start) { - const idx = key.indexOf('.', start); + const idx = key.indexOf(dot, start); return idx === -1 ? key.length : idx; } export function resolveObjectKey(obj, key) { - if (key === '') { + if (key === emptyString) { return obj; } let pos = 0;