From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 28 Nov 2019 12:00:50 +0000 (-0800) Subject: Remove createElement and pre-allocate arrays (#6788) X-Git-Tag: v3.0.0-alpha~211 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1f3cf3c28d85b650d7b74022871e2a141c3fc3fb;p=thirdparty%2FChart.js.git Remove createElement and pre-allocate arrays (#6788) * Remove createElement and pre-allocate arrays * Address review comment --- diff --git a/docs/getting-started/v3-migration.md b/docs/getting-started/v3-migration.md index 1ce1f146c..ffa87614f 100644 --- a/docs/getting-started/v3-migration.md +++ b/docs/getting-started/v3-migration.md @@ -70,6 +70,8 @@ Chart.js 3.0 introduces a number of breaking changes. Chart.js 2.0 was released * `Chart.chart.chart` * `Chart.types` * `DatasetController.addElementAndReset` +* `DatasetController.createMetaData` +* `DatasetController.createMetaDataset` * `Element.getArea` * `Element.height` * `Element.initialize` @@ -104,7 +106,6 @@ Chart.js 3.0 introduces a number of breaking changes. Chart.js 2.0 was released * `helpers.log10` was renamed to `helpers.math.log10` * `Chart.Animation.animationObject` was renamed to `Chart.Animation` * `Chart.Animation.chartInstance` was renamed to `Chart.Animation.chart` -* `DatasetController.createMetaData` and `DatasetController.createMetaDataset` were replaced with `DatasetController.createElement` * `DatasetController.updateElement` was renamed to `DatasetController.updateElements` * `TimeScale.getLabelCapacity` was renamed to `TimeScale._getLabelCapacity` * `TimeScale.tickFormatFunction` was renamed to `TimeScale._tickFormatFunction` diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index 43350bb60..b4f709919 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -153,15 +153,15 @@ function applyStack(stack, value, dsIndex, allOther) { } function convertObjectDataToArray(data) { - var keys = Object.keys(data); - var adata = []; - var i, ilen, key; + const keys = Object.keys(data); + const adata = new Array(keys.length); + let i, ilen, key; for (i = 0, ilen = keys.length; i < ilen; ++i) { key = keys[i]; - adata.push({ + adata[i] = { x: key, y: data[key] - }); + }; } return adata; } @@ -358,17 +358,13 @@ helpers.extend(DatasetController.prototype, { } }, - createElement: function(type) { - return type && new type(); - }, - /** * @private */ _dataCheck: function() { - var me = this; - var dataset = me.getDataset(); - var data = dataset.data || (dataset.data = []); + const me = this; + const dataset = me.getDataset(); + const data = dataset.data || (dataset.data = []); // In order to correctly handle data addition/deletion animation (an thus simulate // real-time charts), we need to monitor these data modifications and synchronize @@ -420,19 +416,21 @@ helpers.extend(DatasetController.prototype, { }, addElements: function() { - var me = this; - var meta = me._cachedMeta; - var metaData = meta.data; - var i, ilen, data; + const me = this; + const meta = me._cachedMeta; + let i, ilen, data; me._dataCheck(); data = me._data; + const metaData = meta.data = new Array(data.length); for (i = 0, ilen = data.length; i < ilen; ++i) { - metaData[i] = metaData[i] || me.createElement(me.dataElementType); + metaData[i] = new me.dataElementType(); } - meta.dataset = meta.dataset || me.createElement(me.datasetElementType); + if (me.datasetElementType) { + meta.dataset = new me.datasetElementType(); + } }, buildOrUpdateElements: function() { @@ -516,14 +514,15 @@ helpers.extend(DatasetController.prototype, { const vId = vScale.id; const labels = iScale._getLabels(); const singleScale = iScale === vScale; - const parsed = []; - let i, ilen, item; + const parsed = new Array(count); + let i, ilen, index; - for (i = start, ilen = start + count; i < ilen; ++i) { - item = {}; - item[iId] = singleScale || iScale._parse(labels[i], i); - item[vId] = vScale._parse(data[i], i); - parsed.push(item); + for (i = 0, ilen = count; i < ilen; ++i) { + index = i + start; + parsed[i] = { + [iId]: singleScale || iScale._parse(labels[index], index), + [vId]: vScale._parse(data[index], index) + }; } return parsed; }, @@ -543,14 +542,16 @@ helpers.extend(DatasetController.prototype, { const {xScale, yScale} = meta; const xId = xScale.id; const yId = yScale.id; - const parsed = []; - let i, ilen, item; - for (i = start, ilen = start + count; i < ilen; ++i) { - item = data[i]; - parsed.push({ - [xId]: xScale._parse(item[0], i), - [yId]: yScale._parse(item[1], i) - }); + const parsed = new Array(count); + let i, ilen, index, item; + + for (i = 0, ilen = count; i < ilen; ++i) { + index = i + start; + item = data[index]; + parsed[i] = { + [xId]: xScale._parse(item[0], index), + [yId]: yScale._parse(item[1], index) + }; } return parsed; }, @@ -570,14 +571,16 @@ helpers.extend(DatasetController.prototype, { const {xScale, yScale} = meta; const xId = xScale.id; const yId = yScale.id; - const parsed = []; - let i, ilen, item; - for (i = start, ilen = start + count; i < ilen; ++i) { - item = data[i]; - parsed.push({ - [xId]: xScale._parseObject(item, 'x', i), - [yId]: yScale._parseObject(item, 'y', i) - }); + const parsed = new Array(count); + let i, ilen, index, item; + + for (i = 0, ilen = count; i < ilen; ++i) { + index = i + start; + item = data[index]; + parsed[i] = { + [xId]: xScale._parseObject(item, 'x', index), + [yId]: yScale._parseObject(item, 'y', index) + }; } return parsed; }, @@ -958,14 +961,15 @@ helpers.extend(DatasetController.prototype, { */ insertElements: function(start, count) { const me = this; - const elements = []; + const elements = new Array(count); const data = me._cachedMeta.data; let i; - for (i = start; i < start + count; ++i) { - elements.push(me.createElement(me.dataElementType)); + for (i = 0; i < count; ++i) { + elements[i] = new me.dataElementType(); } data.splice(start, 0, ...elements); + me._parse(start, count); me.updateElements(data, start, count); },