javascript - 在javascript中的对象中设置具有未知深度的属性值

标签 javascript recursion

var params = {
    search: {
        make: "",
        model: ""
    }
}

function setVariable() {
    var value = "BMW";
    var key = "search.make";
    var arr = key.split(".");    //eg. ["search", "make"]
    params[arr[0]][arr[1]] = value;   // this works, but how do you
                                      // do it with unknown arr[] length?
}

如何使用未知的 arr[] 长度执行此操作?

我推测我可能需要进行递归调用,可能会在函数中传递类似 arr.slice(1) 的内容,但我一直无法弄清楚它应该是什么样子喜欢。

最佳答案

var params = {
    search: {
        make: "",
        model: "",
        whatever: {
            foo: {
                bar: {
                    moo: 123,
                    meow: 'xyz'
                }
            }
        }
    }
};

function updatePath(obj, path, value) {
    var parts = path.split('.');
    var i, tmp;
    for(i = 0; i < parts.length; i++) {
        tmp = obj[parts[i]];
        if(value !== undefined && i == parts.length - 1) {
            tmp = obj[parts[i]] = value;
        }
        else if(tmp === undefined) {
            tmp = obj[parts[i]] = {};
        }
        obj = tmp;
    }
    return obj;
}

演示:

> updatePath(params, 'search.whatever.foo.bar')
{ moo: 123, meow: 'xyz' }
> updatePath(params, 'search.whatever.foo.bar.moo')
123
> updatePath(params, 'search.whatever.foo.bar.moo', 'test')
'test'
> updatePath(params, 'search.whatever.foo.bar.moo')
'test'
> updatePath(params, 'search.whatever.foo.bar')
{ moo: 'test', meow: 'xyz' }
> updatePath(params, 'search.whatever.foo.bar.x.y.z', 'hi')
'hi'
> updatePath(params, 'search.whatever.foo.bar.x')
{ y: { z: 'hi' } }
> updatePath(params, 'search.whatever.foo.bar')
{ moo: 'test',
  meow: 'xyz',
  x: { y: { z: 'hi' } } }
>

关于javascript - 在javascript中的对象中设置具有未知深度的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9554479/

相关文章:

javascript - 页面加载后 document.getElementById(...) 为 null

javascript - 将变量设置为函数的结果,行为非常奇怪

javascript - 如何为对象键设置初始值?

javascript - 表头排序改变行的位置

javascript - 使用一组数字相加得出特定数字

java - Lua 与 Java 中的递归

java 递归插入排序

javascript - 在鼠标悬停时将图像叠加到 Canvas 上

c# - 我怎样才能避免递归?

c++ - 遍历 BST 时出现 Stackoverflow 异常