return applyStack(stack, value, meta.index);
}
+ /**
+ * @protected
+ */
+ updateRangeFromParsed(range, scale, parsed, stack) {
+ let value = parsed[scale.axis];
+ const values = stack && parsed._stacks[scale.axis];
+ if (stack && values) {
+ stack.values = values;
+ // Need to consider individual stack values for data range,
+ // in addition to the stacked value
+ range.min = Math.min(range.min, value);
+ range.max = Math.max(range.max, value);
+ value = applyStack(stack, value, this._cachedMeta.index, true);
+ }
+ range.min = Math.min(range.min, value);
+ range.max = Math.max(range.max, value);
+ }
+
/**
* @protected
*/
getMinMax(scale, canStack) {
- const meta = this._cachedMeta;
+ const me = this;
+ const meta = me._cachedMeta;
const _parsed = meta._parsed;
const sorted = meta._sorted && scale === meta.iScale;
const ilen = _parsed.length;
- const otherScale = this._getOtherScale(scale);
- const stack = canStack && meta._stacked && {keys: getSortedDatasetIndices(this.chart, true), values: null};
- let min = Number.POSITIVE_INFINITY;
- let max = Number.NEGATIVE_INFINITY;
+ const otherScale = me._getOtherScale(scale);
+ const stack = canStack && meta._stacked && {keys: getSortedDatasetIndices(me.chart, true), values: null};
+ const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};
const {min: otherMin, max: otherMax} = getUserBounds(otherScale);
let i, value, parsed, otherValue;
- function _compute() {
- const values = stack && parsed._stacks[scale.axis];
- if (stack && values) {
- stack.values = values;
- // Need to consider individual stack values for data range,
- // in addition to the stacked value
- min = Math.min(min, value);
- max = Math.max(max, value);
- value = applyStack(stack, value, meta.index, true);
- }
- min = Math.min(min, value);
- max = Math.max(max, value);
- }
-
function _skip() {
parsed = _parsed[i];
value = parsed[scale.axis];
if (_skip()) {
continue;
}
- _compute();
+ me.updateRangeFromParsed(range, scale, parsed, stack);
if (sorted) {
+ // if the data is sorted, we don't need to check further from this end of array
break;
}
}
if (sorted) {
+ // in the sorted case, find first non-skipped value from other end of array
for (i = ilen - 1; i >= 0; --i) {
if (_skip()) {
continue;
}
- _compute();
+ me.updateRangeFromParsed(range, scale, parsed, stack);
break;
}
}
- return {min, max};
+ return range;
}
getAllParsedValues(scale) {
const me = this;
// eslint-disable-next-line prefer-const
let {min, max, minDefined, maxDefined} = me.getUserBounds();
- let minmax;
+ let range;
if (minDefined && maxDefined) {
return {min, max};
const metas = me.getMatchingVisibleMetas();
for (let i = 0, ilen = metas.length; i < ilen; ++i) {
- minmax = metas[i].controller.getMinMax(me, canStack);
+ range = metas[i].controller.getMinMax(me, canStack);
if (!minDefined) {
- min = Math.min(min, minmax.min);
+ min = Math.min(min, range.min);
}
if (!maxDefined) {
- max = Math.max(max, minmax.max);
+ max = Math.max(max, range.max);
}
}