Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过传递带有路径和值的字符串来扩展JavaScript对象_Javascript_Jquery_Extend - Fatal编程技术网

通过传递带有路径和值的字符串来扩展JavaScript对象

通过传递带有路径和值的字符串来扩展JavaScript对象,javascript,jquery,extend,Javascript,Jquery,Extend,有没有一种简单的方法可以通过传递字符串和值来扩展JavaScript对象 基本上我需要这样的东西: myObject = {} var extendObj = function(obj, path, value){ } var path = "a.b.c", value = "ciao"; extendObj(myObject, path, value); console.log(myObject.a.b.c) //will print "ciao" 您可以在控制台中看到,它根据您

有没有一种简单的方法可以通过传递字符串和值来扩展JavaScript对象

基本上我需要这样的东西:

myObject = {}

var extendObj = function(obj, path, value){
}

var path = "a.b.c", value = "ciao";
extendObj(myObject, path, value);


console.log(myObject.a.b.c) //will print "ciao"


您可以在控制台中看到,它根据您输入的
path
创建路径。

但是如果未定义空对象,那么
a
b
将是什么。如果它们被定义了,就扩展它。这是不明确的,但我猜假设是——如果它还不存在,就把它创建为一个对象。我认为这里真正的歧义在于:如果b已经存在,但它是一个数字,因此不能有字符串作为成员,那么它该怎么办?@Chris“如果b已经存在,但它是一个数字,因此不能有字符串作为成员,它该怎么办?”这个案子不会发生这正是我想要的need@MarcoCalì-我对代码进行了一点调整,使其能够:1。保留已存在于对象中的值,2。如果现有值的类型不是对象,请重写属性。+1巧妙地使用递归!只是一些细节:递归时不必传递值(实际上,您从未使用参数[1]);你不必重写函数,因为它们可以有属性;如果a或b为空(
typeof null===“object”
),则它将失败。
myObject = {};

var extendObj = function (obj, path, value) {
    var levels = path.split("."),
        i = 0;

    function createLevel(child) {
        var name = levels[i++];
        if(typeof child[name] !== "undefined" && child[name] !== null) {
            if(typeof child[name] !== "object" && typeof child[name] !== "function") {
                console.warn("Rewriting " + name);
                child[name] = {};
            }
        } else {
            child[name] = {};
        }
        if(i == levels.length) {
            child[name] = value;
        } else {
            createLevel(child[name]);
        }
    }
    createLevel(obj);
    return obj;
}

var path = "a.b.c",
    value = "ciao";
extendObj(myObject, path, value);


console.log(myObject.a.b.c) //will print "ciao"