Javascript 将google电子表格结构转换为字典

Javascript 将google电子表格结构转换为字典,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我有一些细胞是这样排列的: { 'd/': { 'dhome/': { 'duser/': { 'ddownloads/': { 'ffile.txt': 'Contents of file' }, 'ddocuments/': { 'fprgm.py': '# python' } } } } } 我想把它们转换成这样一个对象: { 'd

我有一些细胞是这样排列的:

{
  'd/': {
    'dhome/': {
      'duser/': {
        'ddownloads/': {
          'ffile.txt': 'Contents of file'
        },
        'ddocuments/': {
          'fprgm.py': '# python'
        }
      }
    }
  }
}

我想把它们转换成这样一个对象:

{
  'd/': {
    'dhome/': {
      'duser/': {
        'ddownloads/': {
          'ffile.txt': 'Contents of file'
        },
        'ddocuments/': {
          'fprgm.py': '# python'
        }
      }
    }
  }
}
因此,任何以
d
开头的键都是目录,任何以
f
开头的键都是文件,但第一个字符不是其实际名称的一部分


有人知道我是如何做到这一点的吗?

好的,这对我很有用。这可能不是很有效,但它确实起到了作用

function getSpreadsheet()
{
  return SpreadsheetApp.getActiveSpreadsheet();
}

function getRange(r)
{
  return getSpreadsheet().getRange(r);
}

function getDirs()
{
  const range = getRange('folders!A1:Z');
  const raw_s = range.getDisplayValues()
                .map(function(vals)
                {
                  return vals.map(function(val, i, arr)
                  {
                    val = val.trim();

                    if (val == '')
                    {
                      return null;
                    }

                    return [val, i];
                  })
                  .filter(function(val)
                  {
                    return val != null;
                  })
                  [0];
                })
                .filter(function(vals)
                {
                  return vals != null;
                });

  let struc = tree_from_list(raw_s);

  return struc;
}

function tree_from_list(list) {
    var list_node = list.shift();
    var depth = list_node[1];
    var root = {name: list_node[0], children: []};
    var tree_node;
    var cur_nodes = []; 
    cur_nodes[depth] = root;
    while (list.length > 0) {
        list_node = list.shift();
        tree_node = {name: list_node[0], children: []};
        depth = list_node[1];
        if (cur_nodes[depth - 1] === undefined)
            throw 'invalid list!';
        cur_nodes[depth - 1].children.push(tree_node);
        cur_nodes[depth] = tree_node;
    }
    return root;
}

不完全是答案。更像是解决问题的方向

您的输入看起来几乎是有效的:

您可以使用许多工具将YAML解析为JSON。例如:

输出:

{
    "root": {
        "home": {
            "user": {
                "downloads": {
                    "file_txt": "Contents of file"
                },
                "documents": {
                    "prgm_py": "# python"
                }
            }
        }
    }
}


我将通过构建对象的JSON字符串表示法(没有数组,因此更容易实现),然后
JSON.parse()
将该字符串转换为对象。你试过那种方法吗?您是否有任何示例代码?您能否展示您尝试过的内容,并说明您遇到的困难?
{
    "root": {
        "home": {
            "user": {
                "downloads": {
                    "file_txt": "Contents of file"
                },
                "documents": {
                    "prgm_py": "# python"
                }
            }
        }
    }
}