]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Cache sorting order of dataset metas (#6757)
authorJukka Kurkela <jukka.kurkela@gmail.com>
Sat, 14 Dec 2019 18:03:09 +0000 (20:03 +0200)
committerEvert Timberg <evert.timberg+github@gmail.com>
Sat, 14 Dec 2019 18:03:09 +0000 (13:03 -0500)
* Cache sorting order of dataset metas
* Cache dataset visibility

src/core/core.controller.js

index d2977d12bb50e0606f829c30cbffe9513fc8243b..3ea05a925814d48c94343f836f6e49793242fad1 100644 (file)
@@ -396,6 +396,7 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
                var me = this;
                var newControllers = [];
                var datasets = me.data.datasets;
+               var sorted = me._sortedMetasets = [];
                var i, ilen;
 
                for (i = 0, ilen = datasets.length; i < ilen; i++) {
@@ -411,6 +412,7 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
                        meta.order = dataset.order || 0;
                        meta.index = i;
                        meta.label = '' + dataset.label;
+                       meta.visible = me.isDatasetVisible(i);
 
                        if (meta.controller) {
                                meta.controller.updateIndex(i);
@@ -424,8 +426,11 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
                                meta.controller = new ControllerClass(me, i);
                                newControllers.push(meta.controller);
                        }
+                       sorted.push(meta);
                }
 
+               sorted.sort(compare2Level('order', 'index'));
+
                return newControllers;
        },
 
@@ -681,13 +686,15 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
         * @private
         */
        transition: function(easingValue) {
-               var me = this;
+               const me = this;
                var i, ilen;
 
                if (!me._animationsDisabled) {
-                       for (i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {
-                               if (me.isDatasetVisible(i)) {
-                                       me.getDatasetMeta(i).controller.transition(easingValue);
+                       const metas = me._getSortedDatasetMetas();
+                       for (i = 0, ilen = metas.length; i < ilen; ++i) {
+                               let meta = metas[i];
+                               if (meta.visible) {
+                                       meta.controller.transition(easingValue);
                                }
                        }
                }
@@ -705,18 +712,17 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
         */
        _getSortedDatasetMetas: function(filterVisible) {
                var me = this;
-               var datasets = me.data.datasets || [];
+               var metasets = me._sortedMetasets;
                var result = [];
                var i, ilen;
 
-               for (i = 0, ilen = datasets.length; i < ilen; ++i) {
-                       if (!filterVisible || me.isDatasetVisible(i)) {
-                               result.push(me.getDatasetMeta(i));
+               for (i = 0, ilen = metasets.length; i < ilen; ++i) {
+                       const meta = metasets[i];
+                       if (!filterVisible || meta.visible) {
+                               result.push(meta);
                        }
                }
 
-               result.sort(compare2Level('order', 'index'));
-
                return result;
        },
 
@@ -859,13 +865,7 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
        },
 
        getVisibleDatasetCount: function() {
-               var count = 0;
-               for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {
-                       if (this.isDatasetVisible(i)) {
-                               count++;
-                       }
-               }
-               return count;
+               return this._getSortedVisibleDatasetMetas().length;
        },
 
        isDatasetVisible: function(datasetIndex) {