【问题标题】:Convert JSON array of objects to dot notataion [duplicate]将对象的 JSON 数组转换为点符号 [重复]
【发布时间】:2017-06-15 06:16:53
【问题描述】:

我有一个从 mongo 文档中检索到的 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,它几乎可以满足我的需求,但它并没有直接点标记数组。

目前,我没有任何工作/半工作代码要显示,但如果我有一些事情可以朝着正确的方向工作,我会更新这个问题。

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

【问题讨论】:

  • 这看起来像你需要的 npmjs.com/package/flat 只需谷歌搜索“npm flatten json”
  • @TuanAnhTran 当一个简单的函数可以完成时,一个 npm 包似乎有点矫枉过正。看看marked duplicate。适用于所有深度。
  • @TuanAnhTran - 谢谢。这正是我一直在寻找的。不过,我也会看看这个简单的函数。
  • 这是 plunker 中的解决方案:plnkr.co/edit/WhAUssNQoxl61sqJdZ1K(请点赞)

标签: javascript json node.js mongodb


【解决方案1】:

也许您可以以此为起点(在午餐时进行此操作,但尚未对其进行彻底的证明测试)

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

【讨论】:

  • 谢谢奇拉格。我会检查一下。它与重复问题的accepted answer 类似
猜你喜欢
  • 2020-02-06
  • 2015-04-21
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2018-06-26
  • 1970-01-01
  • 2013-02-16
相关资源
最近更新 更多