从字符串创建深层对象,如“obj.obj1.obj2.data”
Create deep object from string like "obj.obj1.obj2.data'
我从单元测试开始。我需要创建一些假数据来运行测试。因此,假设在一个存根方法中,我将obj
作为参数传递,并且我在函数中使用obj.obj1.obj2.data
执行操作。有没有办法设置这个假对象?所以,给定:
obj.obj1.obj2.data
它创建:
obj = {
obj1: {
obj2: {
data: 'whatever'}}}
所以最后会像这样:
var obj = creator('obj.obj1.obj2.data', 20);
假设字符串只是一组对象(没有数组),这应该相当简单。只需在.
上拆分输入字符串,然后使用 while 循环进行嵌套。
function creator(str,val){
var tree = str.split('.');
var ret = {};
var cur = ret;
while(tree.length){
var name = tree.shift();
cur[name] = tree.length ? {} : val;
cur = cur[name];
}
return ret;
}
document.querySelector("#out").innerHTML = JSON.stringify(creator('obj.obj1.obj2.data',20));
<div id="out"></div>
以防万一其他人感兴趣,我创建了一个简单的 npm 模块,其中包含以下函数 (https://github.com/r01010010/zappy) 检查一下:
var objFrom = function(str, last_value){
var objs = str.split('.');
var r = {};
var last = r;
for(i=0; i < objs.length; i++) {
if(i !== objs.length - 1){
last = last[objs[i]] = {};
}else{
last[objs[i]] = last_value;
}
}
return r;
}
var obj = objFrom('obj1.obj2.data', 20);
console.log(obj.obj1.obj2.data);
相关文章:
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- Three.JS OBJ模型未显示
- ThreeJS访问加载的obj模型中的对象
- 无法在obj+mtl文件中加载纹理
- Php variable obj to js
- JSTree's data.rslt.obj.text()返回一个文本数组,而不是所需节点的文本
- 如何将Three.js场景中的几何体导出为已修改的OBJ
- 用Div内容创建obj
- Three.js.obj阴影不起作用
- 将.obj转换为.js文件
- TypeError: 使用 Jquery JSON 获取数据时无效的 'in' 操作数 obj
- 如何更改不是't〃;(obj)”;
- 作为语法的控制器没有将新的obj传递给数组
- TypeError Obj.root是未定义的ajax jquery
- Three.js透明对象和颜色更改(load.obj+.mtl)
- 灯箱:can't从iframe访问父javascript obj
- 测试变量存在性的Javascript多重赋值:var obj=obj||{}
- 如何在Angular JS中将obj转换为字符串
- 从obj c类调用javascript函数对我不起作用
- 从字符串创建深层对象,如“obj.obj1.obj2.data”