UNPKG

@deck.gl/core

Version:

deck.gl core library

58 lines 2.02 kB
// deck.gl // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors /** * Flattens a nested array into a single level array, * or a single value into an array with one value * @example flatten([[1, [2]], [3], 4]) => [1, 2, 3, 4] * @example flatten(1) => [1] * @param array The array to flatten. * @param filter= - Optional predicate called on each `value` to * determine if it should be included (pushed onto) the resulting array. * @return Returns the new flattened array (new array or `result` if provided) */ export function flatten(array, filter = () => true) { // Wrap single object in array if (!Array.isArray(array)) { return filter(array) ? [array] : []; } // Deep flatten and filter the array return flattenArray(array, filter, []); } /** Deep flattens an array. Helper to `flatten`, see its parameters */ function flattenArray(array, filter, result) { let index = -1; while (++index < array.length) { const value = array[index]; if (Array.isArray(value)) { flattenArray(value, filter, result); } else if (filter(value)) { result.push(value); } } return result; } /** Uses copyWithin to significantly speed up typed array value filling */ export function fillArray({ target, source, start = 0, count = 1 }) { const length = source.length; const total = count * length; let copied = 0; for (let i = start; copied < length; copied++) { target[i++] = source[copied]; } while (copied < total) { // If we have copied less than half, copy everything we got // else copy remaining in one operation if (copied < total - copied) { target.copyWithin(start + copied, start, start + copied); copied *= 2; } else { target.copyWithin(start + copied, start, start + total - copied); copied = total; } } return target; } //# sourceMappingURL=flatten.js.map