2017-06-15 113 views
1

我从蒙戈文档检索像一个JSON对象:转换JSON阵列点notataion

{ 
"ipv4": { 
     "enable": "yes", 
     "rule": [ 
      { 
       "flow": { 
        "destinationAddress": "0.0.0.0" 
       } 
      }, 
      { 
       "flow": { 
        "destinationAddress": "2.2.2.2" 
       } 
      } 
     ] 
    } 
} 

我想将它转化成这样:

{ 
    "ipv4.enable": "yes", 
    "ipv4.rule.0.flow.destinationAddress": "0.0.0.0", 
    "ipv4.rule.1.flow.destinationAddress": "2.2.2.2" 
} 

我的问题的前提集中在一个数组中,其中包含对象/数组对象。

我相信这可能会要求在某个级别的递归。什么是实现上述目标的好方法?我来到人口稠密的this npm package即将做我所需要的,但它不直接dot-notate

目前,我没有任何工作/半工作代码可以显示,但是如果我能找到正确的方向工作,我会更新这个问题。

有人可以指点我一些逻辑来获取这个工作吗?我不介意使用任何可用的npm软件包。

+0

这看起来像你需要什么的https:// WWW .npmjs.com/package/flat只需谷歌的“npm flatten json” –

+0

@TuanAnhTran一个npm包似乎是一个简单的函数会做的矫枉过正。看看[标记为重复](https://stackoverflow.com/a/33005742/2313887)。适用于所有的深度。 –

+0

@TuanAnhTran - 谢谢你。这正是我所期待的。虽然,我也会看看简单的功能。 – blueren

回答

0

也许你可以使用这个作为出发点(午餐期间这样做,并没有证据彻底的测试吧)

var data = { 
 
"ipv4": { 
 
     "enable": "yes", 
 
     "rule": [ 
 
      { 
 
       "flow": { 
 
        "destinationAddress": "0.0.0.0" 
 
       } 
 
      }, 
 
      { 
 
       "flow": { 
 
        "destinationAddress": "2.2.2.2" 
 
       } 
 
      } 
 
     ] 
 
    } 
 
}; 
 

 
function dotnotate(data,prefix,dest){ 
 
    prefix = prefix || ""; 
 
    dest = dest || {}; 
 
    var type = typeof(data); 
 
    
 
    switch(type){ 
 
    case "object": 
 
     if(Array.isArray(data)){ 
 
     data.forEach(function(item, i){ 
 
      var tmpPrefix = prefix.length>0?prefix+"."+i:prefix+i; 
 
      dotnotate(item,tmpPrefix,dest); 
 
     }); 
 
     }else{ 
 
     Object.keys(data).forEach(function(key,i){ 
 
      var tmpPrefix = prefix.length>0?prefix+"."+key:prefix+key; 
 
      dotnotate(data[key],tmpPrefix,dest); 
 
     }); 
 
     } 
 
    break; 
 
    case "undefined": 
 
     return; 
 
    default: 
 
     dest[prefix]=data; 
 
    } 
 
    return dest; 
 
     
 
} 
 

 
console.log(dotnotate(data))

+0

谢谢Chirag。我会检查这一点。它与重复问题的[接受的答案]类似(https://stackoverflow.com/a/33005742/1745073) – blueren