flatten源码解析(见注释)

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拍平数组的方法实际上只是通过遍历该数组,如果该数组可被遍历则判断深度是否在条件内,否则直接赋值。有点类似于深拷贝的意思。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容