Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将字符串数组转换为自定义结构_Javascript - Fatal编程技术网

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

Javascript 将字符串数组转换为自定义结构,javascript,Javascript,我需要将这个字符串数组转换成一个特殊的结构 这是我的输入字符串数组: ****************** "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:

我需要将这个字符串数组转换成一个特殊的结构

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

******************
"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....
*******************
我需要这个输出(注意返回正确的订单输出):

有什么建议吗?

您可以
字符串#拆分
数组中的每个字符串#映射
,并使用
数组#还原右键
检查结果对象中的
节点
文本
值。如果某一级别存在
text
键,请将对象重新分配到
节点
键,并用当前的
文本
值填充
文本

var strings=[“productone”、“productone\\level2\\level3”、“productwo\\level2\\level3\\level4”];
const result=strings.map(string=>string.split('\\')).reduceRight((r,text,index)=>{
if(r['text'])
r['nodes']=[Object.assign({},r)];
r['text']=文本;
返回r;
},{}));
控制台日志(结果)
作为控制台包装{max height:100%!important;top:0;}
您可以
string#拆分
数组中的每个字符串#map
并使用
array#reduceRight
检查结果对象中的
节点
文本
值。如果某一级别存在
text
键,请将对象重新分配到
节点
键,并用当前的
文本
值填充
文本

var strings=[“productone”、“productone\\level2\\level3”、“productwo\\level2\\level3\\level4”];
const result=strings.map(string=>string.split('\\')).reduceRight((r,text,index)=>{
if(r['text'])
r['nodes']=[Object.assign({},r)];
r['text']=文本;
返回r;
},{}));
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
通过将给定的部件字符串作为用于收集所有数据的嵌套对象的标识,可以采用嵌套方法获取哈希表

稍后,此建议删除不需要的节点,但不包含内容

这种方法适用于未排序的数据

var数组=[“productone”、“productone\\level2\\level3”、“productwo\\level2\\level3\\level4”],
结果=[],
散列={{u0:result};
array.forEach(函数(a){
a、 拆分(“\\”).reduce(函数(r,k){
如果(!r[k]){
r[k]={{}:[]};
r、 _u.push({text:k,nodes:r[k]。});
}
返回r[k];
},散列);
});
结果。forEach(功能清洁(o){
if(o.nodes.length){
o、 forEach(clean);
}否则{
删除o节点;
}
});
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
通过将给定的部件字符串作为用于收集所有数据的嵌套对象的标识,可以采用嵌套方法获取哈希表

稍后,此建议删除不需要的节点,但不包含内容

这种方法适用于未排序的数据

var数组=[“productone”、“productone\\level2\\level3”、“productwo\\level2\\level3\\level4”],
结果=[],
散列={{u0:result};
array.forEach(函数(a){
a、 拆分(“\\”).reduce(函数(r,k){
如果(!r[k]){
r[k]={{}:[]};
r、 _u.push({text:k,nodes:r[k]。});
}
返回r[k];
},散列);
});
结果。forEach(功能清洁(o){
if(o.nodes.length){
o、 forEach(clean);
}否则{
删除o节点;
}
});
控制台日志(结果)

。作为控制台包装器{max height:100%!important;top:0;}
我扔掉了以前的答案,用这个来代替

这应该正是你想要的

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));

我扔掉了以前的答案,用这个来代替

这应该正是你想要的

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));

我已经解决了我的问题,我已经转换成JavaScript纯代码

我已经解决了我的问题,我已经转换为JavaScript纯代码

这是一个对象数组,不是JSON。JSON是使用
JSON.stringify()
将其转换为字符串时得到的。为什么要为
productone
额外添加一行?在反斜杠上拆分字符串,然后使用循环创建嵌套对象。StackOverflow希望您这样做,我们也希望您这样做。请更新您的问题,以显示您已在某个应用程序中尝试过的内容。有关更多信息,请参阅,并使用:)这是一个对象数组,而不是JSON。JSON是使用
JSON.stringify()
将其转换为字符串时得到的。为什么要为
productone
额外添加一行?在反斜杠上拆分字符串,然后使用循环创建嵌套对象。StackOverflow希望您这样做,我们也希望您这样做。请更新您的问题,以显示您已在某个应用程序中尝试过的内容。有关更多信息,请参阅,并使用:)此解决方案复制productone。。。因此,这不是一个有效的解决方案。我需要检查每次的值,但我不知道这个解决方案如何复制productone。。。因此,这不是一个有效的解决方案。我每次都需要检查值,但我不知道如何检查。是的,这是一个非常好的解决方案,但不幸的是,不尊重数组的排序。我不得不说,如果能在原始问题中看到您的所有要求,那将是一件非常好的事。我真的很抱歉,真的,真的非常有帮助。不幸的是,我在测试后观察到了问题。非常感谢你,这是一个非常好的解决方案,但不幸的是,不尊重数组的排序。我不得不说,在你的原始问题中看到你的所有要求会很好。我真的很抱歉,真的,真的是一个很大的帮助。不幸的是,我在测试后观察到了问题。多谢各位
[
  {
    "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"
              }
            ]
          }
        ]
      }
    ]
  }
]