从字符串创建深层对象,如“obj.obj1.obj2.data”

Create deep object from string like "obj.obj1.obj2.data'

本文关键字:obj obj1 obj2 data 创建 字符串 对象      更新时间:2023-09-26

我从单元测试开始。我需要创建一些假数据来运行测试。因此,假设在一个存根方法中,我将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);