javascript - 修改对象中的第n个嵌套属性

标签 javascript object recursion nested logic

这基本上是一个逻辑问题,应该适用于任何编程语言,我只是碰巧使用 JavaScript 来实现这一点

基本上想象我有某种类似的物体

{Props:"stuff", 
    other: {
        stuff: "etc",
        other: {
            Extra: "filler",
            other: {}
        }
    }
}

本质上,这是一个具有一些未知数量的额外属性的对象,但是每个子对象都有一个同名的嵌套属性“在本例中为“其他”),并且深度可能是无限的,这意味着可能有根对象内有 n 个对象,每个子对象都是另一个 key 相同的对象中的容器(在本例中也是“其他”)

听起来可能比实际情况更复杂,但基本上 other 属性是在根对象中嵌套和重复的

问题是我想创建一个函数来在给定的深度量(n)处打破这个嵌套链,从而将所有进一步的嵌套对象设置为一个值

这可能听起来很复杂,但基本上,在上面的示例中,对象的“其他”属性的嵌套深度为 3,假设我想在深度索引 2 处打破深度,从而将对象更改为仅有一个嵌套的“其他”属性,设置为某个值(例如数字或字符串,例如“5”),而不是设置为也包含其他属性(以及可能的其他属性等)的另一个对象

那么我怎样才能创建一个函数,它接受一个基对象,包含未知数量的嵌套属性 Ruth key k,并使其返回一个新对象(或修改原始对象,但是我更愿意只返回一个与基础对象几乎相同的新对象,除了在深度索引 n 处,带有键 k 的嵌套属性将被设置为 value v,而不是继续在其未知的附加嵌套深度量的链中

我什至无法理解如何做到这一点,我总是只是返回设置索引 k 等于根函数的属性,但将属性本身作为参数传递以代替原始根对象(基本上是递归),除非输入对象不包含属性k,在这种情况下仅返回属性本身,但这只是一个返回最内层嵌套属性的递归方法,但不知道如何实现上述结果,这又是一个与基本对象 Ruth 几乎相同的新对象,除了它的嵌套属性在深度处带有键 k 之外n 被设置为值 v,我完全不知道从哪里开始

最佳答案

我们可以像这样使用递归函数

let obj = {Props:"stuff", 
    other: {
        stuff: "etc",
        other: {
            Extra: "filler",
            other: {
                stuff: "abc",
                other:{
                    stuff: "acbh",
                    other: {}
                }
            }
        }
    }
};

function normalizeObjectDepth(obj, level, curr_level, key){
    if(curr_level==level-1){
        obj.other = key;
        return;
    }
    normalizeObjectDepth(obj.other, level, curr_level+1, key);
}

normalizeObjectDepth(obj, 3, 0, 5);

console.log(obj);

关于javascript - 修改对象中的第n个嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63900191/

相关文章:

javascript - 同时使用键盘和鼠标右键单击菜单

javascript - 我该如何修复我的表单验证

javascript - 为什么 Sequelize 中会返回 Promise

haskell - haskell中的递归实例

c - 为什么即使没有基本情况,递归也能起作用?

algorithm - 就地递归快速排序

javascript - 将谷歌字体添加到tinyMCE

javascript - 如何更改提供的 jQuery 以正确切换菜单?

不允许声明 Java 变量

java - 当 Java 对象变得太大时会发生什么?