_.flattenDepth(array, [depth=1])
17
_.flattenDepth(array, [depth=1])
_.flattenDepth根据自定义层数展开数组
参数
array (Array): 需要展开的数组
[depth=1] (number): 最大递归层数
返回值
(Array):返回展开后的新数组
例子
var array = [1, [2, [3, [4]], 5]]; _.flattenDepth(array, 1); // => [1, 2, [3, [4]], 5] _.flattenDepth(array, 2); // => [1, 2, 3, [4], 5]
源代码:
下面是flattenDepth
import baseFlatten from './.internal/baseFlatten.js' /** * Recursively flatten `array` up to `depth` times. * * @since 4.4.0 * @category Array * @param {Array} array The array to flatten. * @param {number} [depth=1] The maximum recursion depth. * @returns {Array} Returns the new flattened array. * @see flatMap, flatMapDeep, flatMapDepth, flattenDeep * @example * * const array = [1, [2, [3, [4]], 5]] * * flattenDepth(array, 1) * // => [1, 2, [3, [4]], 5] * * flattenDepth(array, 2) * // => [1, 2, 3, [4], 5] */ //根据自定义层数展开数组 function flattenDepth(array, depth) { const length = array == null ? 0 : array.length//数组长度 if (!length) {//如果数组没有长度,返回空数组 return [] } depth = depth === undefined ? 1 : +depth//默认展开一层,否则展开depth层 return baseFlatten(array, depth)//返回调用baseFlatten的结果 } export default flattenDepth
下面是baseFlatten
import isFlattenable from './isFlattenable.js' /** * The base implementation of `flatten` with support for restricting flattening. * * @private * @param {Array} array The array to flatten. * @param {number} depth The maximum recursion depth. * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. * @param {Array} [result=[]] The initial result value. * @returns {Array} Returns the new flattened array. */ //这个方法用于数组展开 //array需要展开操作的数组,depth需要展开的层数 //predicate用于判断值是否可展开 //isStrict标识用于判断是否约束值必须通过predicate方法的检查 function baseFlatten(array, depth, predicate, isStrict, result) { predicate || (predicate = isFlattenable)//predicate每次循环都会调用,用来判断当前值是否是一个可展开的array-like对象 result || (result = []) if (array == null) {//需要展开的数组是空,就返回空数组 return result } for (const value of array) { if (depth > 0 && predicate(value)) {//如果展开层数大于0且当前循环值可展开 if (depth > 1) {//如果展开层数大于一层就继续递归调用,层数减一 // Recursively flatten arrays (susceptible to call stack limits). baseFlatten(value, depth - 1, predicate, isStrict, result) } else {//如果只展开一层,就展开后push到result里 result.push(...value) } } else if (!isStrict) {//如果没有传递isStrict标识,就直接将当前循环值push入结果数组 result[result.length] = value } } return result } export default baseFlatten
下面是isFlattenable
import isArguments from '../isArguments.js' /** Built-in value reference. */ const spreadableSymbol = Symbol.isConcatSpreadable /** * Checks if `value` is a flattenable `arguments` object or array. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. */ //检查一个变量是否是一个可展开的对象或者数组 function isFlattenable(value) { return Array.isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]) //如果是数组,则可展开 //如果是arguments对象,则可展开 //如果当前环境含有Symbol对象,且此变量含有Symbol.isConcatSpreadable属性,Symbol.isConcatSpreadable用于改变array或者array-like对象使用concat时的默认行为 } export default isFlattenable