
本文介绍如何编写一个函数,在对象中安全地删除指定属性(如存在),并基于它们的值计算出新属性(如 totalshelves),使用可选链与空值合并运算符确保健壮性。
本文介绍如何编写一个函数,在对象中安全地删除指定属性(如存在),并基于它们的值计算出新属性(如 totalshelves),使用可选链与空值合并运算符确保健壮性。
在实际开发中,我们常需对已有对象进行“结构重组”——例如将多个相关字段合并为一个汇总字段,并移除原始字段。针对厨房库存类数据,典型需求是将 shelvesInCupboards 和 shelvesNotInCupboards 合并为 totalShelves,同时清理冗余字段。
以下是一个简洁、健壮且符合现代 JavaScript 最佳实践的实现:
function sortTheKitchen(kitchen) {
kitchen.totalShelves =
(kitchen?.shelvesInCupboards ?? 0) + (kitchen?.shelvesNotInCupboards ?? 0);
delete kitchen.shelvesInCupboards;
delete kitchen.shelvesNotInCupboards;
return kitchen;
}
✅ 关键设计说明:
- kitchen?.shelvesInCupboards ?? 0 利用可选链(?.) 避免访问 undefined 或 null 时抛出错误,再通过空值合并运算符(??) 提供默认值 0,确保加法运算始终安全;
- delete 操作符直接从对象上移除目标属性,不影响后续赋值(totalShelves 已在删除前完成计算与写入);
- 无需冗长的 if/else 分支判断,逻辑更清晰、可维护性更高。
⚠️ 注意事项:
- 此函数直接修改原对象(mutating)。若需不可变操作(如 Redux 或函数式编程场景),应先浅拷贝对象:const updated = { ...kitchen },再对 updated 执行计算与删除;
- delete 对 undefined 属性无副作用,因此即使某属性不存在,代码仍能安全执行;
- 若字段可能为 0、false 或 ''(falsy 但非 null/undefined),原问题中使用 && 的判断方式会误判(例如 0 && 5 为 false),而 ?? 仅在 null 或 undefined 时触发,默认值机制更准确。
示例调用:
const kitchen = { shelvesInCupboards: 3, shelvesNotInCupboards: 2 };
console.log(sortTheKitchen(kitchen));
// → { totalShelves: 5 }
该方案兼顾简洁性、鲁棒性与可读性,是处理类似“字段归并+清理”任务的推荐模式。










