javascript - 将字符串数组转换为自定义结构

标签 javascript

我需要将这个字符串数组转换成一个特殊的结构 https://github.com/jonmiles/bootstrap-treeview

这是我的输入字符串数组:

******************
"productone"
"productone\level2\level3"
"productwo"
"productwo\level2\level3\level4"
"productwo\level2\level3.1\level4\level5"
"productwo\level2\level3.2\level4\level5"

 so can you imagine this:

"memory"
"memory\ram"
"memory\ram\ddr\sodimm\533mhz\4gb"
"memory\ram\ddr\sodimm\533mhz\8gb"
"memory\ram\ddr\sodimm\533mhz\16gb"
"memory\ram\ddr\sodimm2\633mh\4gb
"memory\ram\ddr\sodimm2\633mh\16gb
"memory\disk"
and so on....
*******************

我需要这个输出(注意返回正确的顺序输出):

var jsondata = [
  {
  "text": "productone",
  "nodes":[ {"text": "level2",
            "nodes":[{"text": "level3"}]
           }]
  },
  {
  "text": "productwo",
   "nodes":[{"text": "level2"},
            "nodes":[{"text": "level3",
                        "nodes":[{text:level4}]
                    }]
            }]
  }    
}]

有什么建议吗?

最佳答案

我扔掉了之前的答案,用这个答案代替。

这应该完全符合您的要求。

var src = [
  "productone",
  "productone\\level2\\level3",
  "productwo\\level2\\level3\\level4",
  "productone\\level2\\dog",
  "productone\\level2\\dog\\bark",
  "productwo\\level2\\level3a\\level4a",
  "productwo\\level2\\level3\\level4\\level5",
  "productwo\\food\\desserts\\cookies",
  "productwo\\food\\desserts\\cakes",
  "productwo\\food\\desserts\\pies",
  "productone\\level2\\cat",
  "productone\\level2\\cat\\meow"
]

function tempToObj(temp) {
  var result = [];
  Object.keys(temp).forEach(
    function(key) {
      var obj = {
        text: key
      };

      var nodes = tempToObj(temp[key]);
      if (nodes.length > 0) {
        obj.nodes = nodes;
      }

      result.push(obj);
    }
  );

  return result;
}

function strsToObj(strList) {
  var result = [];
  var tempResult = {};

  function buildNode(parts, idx, obj) {
    var key = parts[idx];

    obj[key] = obj[key] || {};

    idx++;
    if (idx < parts.length) {
      buildNode(parts, idx, obj[key]);
    }
  }

  strList.forEach(
    function(str) {
      var parts = str.split('\\');
      buildNode(parts, 0, tempResult);
    }
  );

  return tempToObj(tempResult);
}

var obj = strsToObj(src);
console.log(JSON.stringify(obj,0,2));

我发现构建对象结构然后将其转换为您想要的格式要容易得多。这简化了解析算法,但又防止每次都重建所有内容。

上面代码的结果是这样的:

[
  {
    "text": "productone",
    "nodes": [
      {
        "text": "level2",
        "nodes": [
          {
            "text": "level3"
          },
          {
            "text": "dog",
            "nodes": [
              {
                "text": "bark"
              }
            ]
          },
          {
            "text": "cat",
            "nodes": [
              {
                "text": "meow"
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "text": "productwo",
    "nodes": [
      {
        "text": "level2",
        "nodes": [
          {
            "text": "level3",
            "nodes": [
              {
                "text": "level4",
                "nodes": [
                  {
                    "text": "level5"
                  }
                ]
              }
            ]
          },
          {
            "text": "level3a",
            "nodes": [
              {
                "text": "level4a"
              }
            ]
          }
        ]
      },
      {
        "text": "food",
        "nodes": [
          {
            "text": "desserts",
            "nodes": [
              {
                "text": "cookies"
              },
              {
                "text": "cakes"
              },
              {
                "text": "pies"
              }
            ]
          }
        ]
      }
    ]
  }
]

关于javascript - 将字符串数组转换为自定义结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47419133/

相关文章:

Javascript条件输入id语句

javascript - 无限图像自动收报机动画口吃

javascript - 从 Angular js 中的 Go 模板获取数据

javascript - 添加一些缓动 jQuery

javascript - Flow 允许与 object.entries 和字符串连接

javascript - 将 CSS 应用于正确放置的字母

javascript - 销毁 ev.preventDefault()

javascript - 在 HTML 中显示带有空格的 Javascript 数组

javascript - 如何从按钮中删除类并在 sweetalert2 中添加自定义类?

javascript - 如何将值与 ember 模板中的查找表进行比较