]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
perf: resolveObjectKey (#8434)
authorJukka Kurkela <jukka.kurkela@gmail.com>
Mon, 15 Feb 2021 21:15:58 +0000 (23:15 +0200)
committerGitHub <noreply@github.com>
Mon, 15 Feb 2021 21:15:58 +0000 (16:15 -0500)
* perf: resolveObjectKey
* Fix tests
* prevent string construction

src/helpers/helpers.core.js

index 20c0f6e3bdf13d2047623ed31b197a70c6befe73..159c1335c4c9a76cc5d17f3d762ae2e42f908879 100644 (file)
@@ -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 === 'y') {
-    return obj.y;
+  if (key === emptyString) {
+    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;
 }