将JSON对象数组转换为dot notataion

时间:2017-06-15 06:16:54

标签: javascript json node.js mongodb

我有一个从mongo doc中检索到的JSON对象,如:

{
"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 一个数组。

目前,我没有任何工作/半工作代码可以展示,但如果我能够朝着正确的方向努力,我会更新这个问题。

有人能指出我获得这个orking的逻辑吗?我不介意使用任何可用的npm包。

1 个答案:

答案 0 :(得分: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))