动态设置嵌套对象的属性

我有一个对象,它可以是任何数量的深度,并且可以具有任何现有属性。例如:

var obj = {

db: {

mongodb: {

host: 'localhost'

}

}

};

在此我想设置(或覆盖)属性,如下所示:

set('db.mongodb.user', 'root');

// or:

set('foo.bar', 'baz');

属性字符串可以具有任何深度,并且值可以是任何类型/事物。

如果属性键已经存在,则不需要合并对象和数组作为值。

前面的示例将产生以下对象:

var obj = {

db: {

mongodb: {

host: 'localhost',

user: 'root'

}

},

foo: {

bar: baz

}

};

如何实现这种功能?

回答:

此函数使用您指定的参数应添加/更新obj容器中的数据。请注意,您需要跟踪obj架构中的哪些元素是容器,哪些是值(字符串,整数等),否则您将开始引发异常。

obj = {};  // global object

function set(path, value) {

var schema = obj; // a moving reference to internal objects within obj

var pList = path.split('.');

var len = pList.length;

for(var i = 0; i < len-1; i++) {

var elem = pList[i];

if( !schema[elem] ) schema[elem] = {}

schema = schema[elem];

}

schema[pList[len-1]] = value;

}

set('mongo.db.user', 'root');

以上是 动态设置嵌套对象的属性 的全部内容, 来源链接: utcz.com/qa/399095.html

回到顶部