Lodash源码解析-_.flatten

_.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)