_.flatten(array)
15
_.flatten(array)
_.flatten方法将数组展开一层
参数
array (Array): 需要展开的数组
返回值
(Array):返回展开后的新数组
例子
_.flatten([1, [2, [3, [4]], 5]]); // => [1, 2, [3, [4]], 5]
源代码:
以下是flatten
import baseFlatten from './.internal/baseFlatten.js' /** * Flattens `array` a single level deep. * * @since 0.1.0 * @category Array * @param {Array} array The array to flatten. * @returns {Array} Returns the new flattened array. * @see flatMap, flatMapDeep, flatMapDepth, flattenDeep, flattenDepth * @example * * flatten([1, [2, [3, [4]], 5]]) * // => [1, 2, [3, [4]], 5] */ //展开数组一层 function flatten(array) { const length = array == null ? 0 : array.length//数组长度 return length ? baseFlatten(array, 1) : []//如果数组长度为0返回空数组,否则调用baseFlatten展开数组一层 } export default flatten
下面是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