通过传递带有路径和值的字符串来扩展JavaScript对象
有没有一种简单的方法可以通过传递字符串和值来扩展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" 您可以在控制台中看到,它根据您
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"