Skip to content

Commit

Permalink
improve flatten perf
Browse files Browse the repository at this point in the history
  • Loading branch information
Xiaoji Chen committed Mar 7, 2020
1 parent 20d2fec commit 5b0ace9
Show file tree
Hide file tree
Showing 5 changed files with 10 additions and 12 deletions.
2 changes: 1 addition & 1 deletion modules/core/src/lib/composite-layer.js
Expand Up @@ -218,7 +218,7 @@ export default class CompositeLayer extends Layer {
// Flatten the returned array, removing any null, undefined or false
// this allows layers to render sublayers conditionally
// (see CompositeLayer.renderLayers docs)
subLayers = flatten(subLayers, {filter: Boolean});
subLayers = flatten(subLayers, Boolean);
this.internalState.subLayers = subLayers;
}
debug(TRACE_RENDER_LAYERS, this, shouldUpdate, subLayers);
Expand Down
2 changes: 1 addition & 1 deletion modules/core/src/lib/layer-manager.js
Expand Up @@ -172,7 +172,7 @@ export default class LayerManager {
}
this.lastRenderedLayers = newLayers;

newLayers = flatten(newLayers, {filter: Boolean});
newLayers = flatten(newLayers, Boolean);

for (const layer of newLayers) {
layer.context = this.context;
Expand Down
2 changes: 1 addition & 1 deletion modules/core/src/lib/view-manager.js
Expand Up @@ -209,7 +209,7 @@ export default class ViewManager {
// Update the view descriptor list and set change flag if needed
// Does not actually rebuild the `Viewport`s until `getViewports` is called
_setViews(views) {
views = flatten(views, {filter: Boolean});
views = flatten(views, Boolean);

const viewsChanged = this._diffViews(views, this.views);
if (viewsChanged) {
Expand Down
12 changes: 6 additions & 6 deletions modules/core/src/utils/flatten.js
Expand Up @@ -30,24 +30,24 @@
* @param {Array} result=[] - Optional array to push value into
* @return {Array} Returns the new flattened array (new array or `result` if provided)
*/
export function flatten(array, {filter = () => true, map = x => x, result = []} = {}) {
export function flatten(array, filter = () => true) {
// Wrap single object in array
if (!Array.isArray(array)) {
return filter(array) ? [map(array)] : [];
return filter(array) ? [array] : [];
}
// Deep flatten and filter the array
return flattenArray(array, filter, map, result);
return flattenArray(array, filter, []);
}

// Deep flattens an array. Helper to `flatten`, see its parameters
function flattenArray(array, filter, map, result) {
function flattenArray(array, filter, result) {
let index = -1;
while (++index < array.length) {
const value = array[index];
if (Array.isArray(value)) {
flattenArray(value, filter, map, result);
flattenArray(value, filter, result);
} else if (filter(value)) {
result.push(map(value));
result.push(value);
}
}
return result;
Expand Down
4 changes: 1 addition & 3 deletions test/modules/core/utils/flatten.spec.js
Expand Up @@ -49,9 +49,7 @@ const FLATTEN_TEST_CASES = [
},
{
title: 'nested three levels with predicate',
opts: {
filter: Boolean
},
opts: Boolean,
argument: [1, [[2], null], [[4, [null]], 6]],
result: [1, 2, 4, 6]
}
Expand Down

0 comments on commit 5b0ace9

Please sign in to comment.