_.flatten(array)
减少一级array嵌套深度。
例子:
_.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) : []
}
=> baseFlatten():
function baseFlatten(array, depth, predicate, isStrict, result) {
// isFlattenable用来判断是否是可扁平化处理的类数组
predicate || (predicate = isFlattenable)
result || (result = [])
if (array == null) {
return result
}
for (const value of array) {
if (depth > 0 && predicate(value)) {
if (depth > 1) {
// Recursively flatten arrays (susceptible to call stack limits).(用了递归的思路)
// 深度 > 1 就继续递归
baseFlatten(value, depth - 1, predicate, isStrict, result)
} else {
// 深度为 1 的时候,直接把数据push给新数组
result.push(...value)
}
} else if (!isStrict) {
// isStrict标识用于判断是否约束值必须通过predicate方法的检查
// 如果没有传递isStrictct参数,直接将值push入新数组
result[result.length] = value
}
}
return result
}
=> isFlattenable():
function isFlattenable(value) {
return Array.isArray(value) || isArguments(value) ||
!!(value && value[spreadableSymbol])
}
flatten家族的其他方法:
- flattenDeep()
_.flattenDeep(array) //将array递归为一维数组。
例子:
_.flattenDeep([1, [2, [3, [4]], 5]]);
// => [1, 2, 3, 4, 5]
- flattenDepth()
_.flattenDepth(array, [depth=1])
例子:
var array = [1, [2, [3, [4]], 5]];
_.flattenDepth(array, 1);
// => [1, 2, [3, [4]], 5]
_.flattenDepth(array, 2);
// => [1, 2, 3, [4], 5]