我来用“清理房间”的比喻,轻松解释 Lodash 中 compact 方法的实现原理,保证新手也能秒懂! 🧹
1. 检查参数是否有效
- 情况一:如果数组是空的,或者没有传入数组,直接返回空数组
[]。compact([]) // 返回 [] compact(null) // 返回 []
2. 准备一个“干净”的新数组
- 初始化一个空的结果数组(想象成一个空箱子,用来装保留下来的“真值”元素)。
const result = [];
3. 开始“清理”每个元素
- 遍历原数组的每一个元素,判断它是不是“假值”(即需要被清理掉的垃圾):
- 假值包括:
false、0、""、null、undefined、NaN。 - 真值包括:除了上述假值之外的所有值(比如
true、1、"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"]
关键点总结
- 参数检查:处理空数组或无效输入。
- 保留真值:通过
if (value)过滤掉所有假值。 - 返回新数组:不修改原数组,生成一个干净的数组。
这样,无论原数组多杂乱,compact 都能帮你清理得干干净净! 🧼