Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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,我有一个这样的物体: { "root.apple.color": "red", "root.apple.shape": "circle", "root.peach[0].color": "green", "root.peach[1].color": "yellow", } { "root": { "apple": { "color": "red", "shape": "circle" }, "peach": [ {

我有一个这样的物体:

{
  "root.apple.color": "red",
  "root.apple.shape": "circle",
  "root.peach[0].color": "green",
  "root.peach[1].color": "yellow",
}
{
  "root": {
    "apple": {
      "color": "red",
      "shape": "circle"
    },
    "peach": [
      {
        "color": "green" 
      },
      {
        "color": "yellow" 
      }
    ]
  }
}
如何将其转换为以下对象:

{
  "root.apple.color": "red",
  "root.apple.shape": "circle",
  "root.peach[0].color": "green",
  "root.peach[1].color": "yellow",
}
{
  "root": {
    "apple": {
      "color": "red",
      "shape": "circle"
    },
    "peach": [
      {
        "color": "green" 
      },
      {
        "color": "yellow" 
      }
    ]
  }
}

基本上,我需要一个函数,它可以将任何具有定义为顶级示例的值的数组转换为具有实际参数的多级对象。

此实现仅适用于对象嵌套。您可以自己添加阵列感知

函数nestedobj,strPropertyChain,值{ var props=strPropertyChain.split'; var len=支柱长度; var o=obj[props[0]]=obj[props[0]]| |{}; 道具1,镜头1 .forEachprop=>o=o[prop]={}; o[props[len-1]]=值; 返回obj; } 变量obj1={ 根。苹果。颜色:红色, 根。苹果。形状:圆形, 根。桃。颜色:绿色, 根。梨。颜色:黄色, } 变量obj2={} Object.keysobj1.forEachk=>nestedobj2,k,obj1[k]; console.logobj2 你可以这样做

Object.prototype.setNestedValue=函数…a{ a、 长度>2?此[a[0]]==对象的类型和此[a[0]!==空?此[a[0]]。setNestedValue…a.1 :this[a[0]]=isNaNa[1]?{}:new Arraya[1], 此[a[0]]。setNestedValue…a.1 :此[a[0]]=a[1]; 归还这个; }; 风险值数据={ 根。苹果。颜色:红色, 根。苹果。形状:圆形, 根.桃[0].颜色:绿色, 根。桃[1]。颜色:黄色, }, ok=Object.keysdata, o=ok.reduceo,k=>o.setNestedValue…k.replace[,…replace],.split..concatdata[k],{};
console.logJSON.stringifyo 使用Object.keys、String.split、Array.isArray、Array.forEach函数的扩展解决方案:

var obj={ 根。苹果。颜色:红色, 根。苹果。形状:圆形, 根.桃[0].颜色:绿色, 根.桃[0].形状:方形, 根。桃[1]。颜色:黄色, root.apple.info.items[0]。类型:text, root.apple.info.items[0]。活动:true, root.apple.info.items[1]。类型:image, root.apple.info.items[1]。活动:false, root.apple.external.toggle[0]。id:left, root.apple.external.toggle[0]。内容:Ext, root.test:测试 }, 结果={}; 函数transformObjectObjectObj,结果{ 无功电流, checkProp=函数prop,objItem,is_数组,idx,val{ 如果Array.isArraycurrent&&val{ 如果idx的类型=='number'&¤t[idx]{ 当前[idx][prop]=val; }否则{ var o={}; o[prop]=val; 当前的pusho; } }否则{ objItem[prop]=objItem[prop]| |!是_数组吗?{}:[]; 如果val objItem[prop]=val; 当前=对象[prop]; } }, re=/\[\d\]$/; Object.keysobj.foreachk函数{ var props=k.split。, lastKey=props.length-1, val=obj[k],idx; props.forEachfunction道具,k{ var是_数组=re.testprop; 如果是_数组{idx=+prop.matchre[1];prop=prop.replace,;}; checkPropprop,!current?结果:current,是数组,idx,k==lastKey?val:null; }; 电流=零; }; 返回结果; }
console.logJSON.StringifyTransformObjectObjectObj,结果,0,4;转换任何数组-示例输入不是数组。但不管怎样,你被困在哪里了?也许从Object.keysinput上的循环开始,然后使用split。在每个键上?所以,试着写一个,如果你有一个与你的尝试相关的特定问题,发布这个问题。我需要的不是问题。@dfsq这很好,但是如果我有更多的级别,它会失败-如果我有例如{root.peach[0]。颜色:绿色,root.peach[0]。形状:圆圈}它应该输出:{root:{peach:[{color:green,shape:circle,}]}}请看更多示例:我已经更新了解决方案以修复数组:@Mato,我还更新了解决方案以解决更复杂的问题。请参阅我的更新