如何通过路径数组删除JavaScript嵌套对象的指定属性?
解决嵌套对象按路径删除属性的问题
这个场景我太熟悉了!直接用forEach遍历整个路径数组的话,最后你拿到的是要删除的属性值(比如这里的10),而不是它的父容器obj.a.b.c,当然没法执行删除操作。核心思路是:先导航到目标属性的父对象,再删除目标属性。
方法一:用for循环(直观易理解)
这种方式逻辑最清晰,遍历路径的前length-1个元素,定位到父对象后,再删除最后一个路径对应的属性:
const path = ["a", "b", "c", "d"]; let obj = {"a": {"b": {"c": {"d": 10, "e": 20 }}}}; // 初始化当前对象为根节点 let current = obj; // 遍历路径的前3个元素(a、b、c) for (let i = 0; i < path.length - 1; i++) { // 提前判断,避免路径不存在时报错 if (!current) break; current = current[path[i]]; } // 确保父对象存在,再删除目标属性 if (current) { delete current[path[path.length - 1]]; } console.log(obj); // 输出:{"a": {"b": {"c": {"e": 20 }}}}
方法二:用forEach实现(满足你的遍历需求)
如果一定要用forEach,可以在遍历的时候通过索引判断是否是最后一个元素:前面的元素用来导航到父对象,最后一个元素执行删除操作:
const path = ["a", "b", "c", "d"]; let obj = {"a": {"b": {"c": {"d": 10, "e": 20 }}}}; let current = obj; path.forEach((key, index) => { // 路径不存在时直接退出,避免报错 if (!current) return; if (index === path.length - 1) { // 最后一个路径元素,执行删除 delete current[key]; return; } // 非最后一个元素,继续导航到下一层 current = current[key]; }); console.log(obj); // 输出:{"a": {"b": {"c": {"e": 20 }}}}
注意事项
- 一定要加
current存在性判断,防止路径中的某个key不存在时,代码抛出Cannot read properties of undefined的错误。 delete操作只会删除对象的属性,如果目标属性不存在,delete会返回true(不会报错),所以不用额外判断属性是否存在。
内容的提问来源于stack exchange,提问作者jezrael
相关产品推荐
相关产品推荐

