lodash 代码解析 --compact

88 阅读2分钟

我来用“清理房间”的比喻,轻松解释 Lodash 中 compact 方法的实现原理,保证新手也能秒懂! 🧹


1. 检查参数是否有效

  • 情况一:如果数组是空的,或者没有传入数组,直接返回空数组 []
    compact([])          // 返回 []
    compact(null)        // 返回 []
    

2. 准备一个“干净”的新数组

  • 初始化一个空的结果数组(想象成一个空箱子,用来装保留下来的“真值”元素)。
    const result = [];
    

3. 开始“清理”每个元素

  • 遍历原数组的每一个元素,判断它是不是“假值”(即需要被清理掉的垃圾):
    • 假值包括:false0""nullundefinedNaN
    • 真值包括:除了上述假值之外的所有值(比如 true1"hello"{}[] 等)。
// 例子:原数组 [0, 1, false, "apple", null]
// 遍历每个元素:
0       → 假值 → 丢弃 ❌
1       → 真值 → 保留 ✅
false   → 假值 → 丢弃 ❌
"apple" → 真值 → 保留 ✅
null    → 假值 → 丢弃 ❌

4. 将“真值”放进新数组

  • 如果元素是真值,就把它推入结果数组中。
  • 最终返回这个干净的新数组。

完整代码模拟

function compact(array) {
  // 1. 处理无效参数
  if (!array || !array.length) return [];

  // 2. 初始化结果数组
  const result = [];

  // 3. 遍历原数组,清理假值
  for (let i = 0; i < array.length; i++) {
    const value = array[i];
    // 检查是否为真值(如果 value 是真值,条件为 true)
    if (value) {
      result.push(value);
    }
  }

  return result;
}

为什么 if (value) 能判断假值?

  • JavaScript 中,if (value) 会自动将 value 转换为布尔值:
    • 假值 → 转成 false,条件不成立。
    • 真值 → 转成 true,条件成立。

举个实际例子

compact([0, 1, false, "apple", null, NaN]);
// 执行过程:
// 检查每个元素:
// 0 → 假值 → 丢弃
// 1 → 真值 → 保留
// false → 假值 → 丢弃
// "apple" → 真值 → 保留
// null → 假值 → 丢弃
// NaN → 假值 → 丢弃
// 结果:[1, "apple"]

关键点总结

  1. 参数检查:处理空数组或无效输入。
  2. 保留真值:通过 if (value) 过滤掉所有假值。
  3. 返回新数组:不修改原数组,生成一个干净的数组。

这样,无论原数组多杂乱,compact 都能帮你清理得干干净净! 🧼