美文网首页
Lodash源码解析-_.flatten

Lodash源码解析-_.flatten

作者: 小妍妍说 | 来源:发表于2021-07-06 15:46 被阅读0次
    _.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]
    

    相关文章

      网友评论

          本文标题:Lodash源码解析-_.flatten

          本文链接:https://www.haomeiwen.com/subject/gljgultx.html