我有一个对象,它可以是任何数量的深度,并且可以具有任何现有属性。例如:
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
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');