lodash上面是这样解释该方法的:减少一级array嵌套深度。在面试的时候也会经常碰到面试官问如果拍平一个数组。
- faltten依赖于baseFlatten函数,由于该函数有一些多余的参数影响阅读,所以我进行了一些精简。
// 在数组中push一项,并返回该数组
var arrayPush = require('./_arrayPush'),
// 判断该值是否可以使用spread运算符
isFlattenable = require('./_isFlattenable');
function baseFlatten(array, depth, predicate) {
var index = -1,
length = array.length;
// 如果predicate为false则把isFlattenable的值赋给它
predicate || (predicate = isFlattenable);
// 同上
var result = [];
while (++index < length) {
var value = array[index];
if (depth > 0 && predicate(value)) {
if (depth > 1) {
// 递归调用
baseFlatten(value, depth - 1, predicate);
} else {
将数组的每一项push到数组中
arrayPush(result, value);
}
} else {
result[result.length] = value;
}
}
return result;
}
module.exports = baseFlatten;
- faltten实现
function flatten(array) {
var length = array == null ? 0 : array.length;
return length ? baseFlatten(array, 1) : [];
}
- 可以看出faltten拍平数组的方法实际上只是通过遍历该数组,如果该数组可被遍历则判断深度是否在条件内,否则直接赋值。有点类似于深拷贝的意思。