Javascript:打印 JSON 树中的所有路径,包括数组

Posted

技术标签:

【中文标题】Javascript:打印 JSON 树中的所有路径,包括数组【英文标题】:Javascript: Print all paths in a JSON tree including arrays 【发布时间】:2019-05-05 08:28:04 【问题描述】:

示例 JSON:


  name: "A",
  childNodes: [
    name: "B",
    childProps: [
      prop_list: [
        name: "BS1"
      , 
        name: "BS2"
      ]
    ],
    childNodes: [
      name: "C",
      childProps: [
        prop_list: [
          name: "CS1"
        , 
          name: "CS2"
        ]
      ],

    ]


  ],
  childProps: [
    prop_list: [
      name: "AS1"
    , 
      name: "AS2"
    ]
  ]

我想以下列方式打印输出。

    A, B, BS1
    A, B, BS2
    A, B, C, CS1
    A, B, C, CS2
    A, AS1
    A, AS2

基本上,我想打印每个叶节点的路径。 (而且我需要获取每个对象的 name 属性值)

【问题讨论】:

javascript flattening an array of arrays of objects的可能重复 不清楚你不包括AchildPropsCS1AS2)。 另见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 我已经更正了。 AS1 和 AS2 在 A 的 childProps 属性中 @Lizzzz90 您首先必须将其展平为数组;然后.join(', ') 到字符串...遍历结构,同时构建字符串也可以。 【参考方案1】:

要解决您的问题,您必须遍历对象中的每个项目并使用递归函数将嵌套名称附加到路径字符串。

这是一个让您入门的示例

var obj = 
  name: "A",
  childNodes: [
    name: "B",
    childProps: [
      prop_list: [
        name: "BS1"
      , 
        name: "BS2"
      ]
    ],
    childNodes: [
      name: "C",
      childProps: [
        prop_list: [
          name: "CS1"
        , 
          name: "CS2"
        ]
      ],

    ]


  ],
  childProps: [
    prop_list: [
      name: "AS1"
    , 
      name: "AS2"
    ]
  ]
;

(function findName(o, path = '') 
  const isLastLevel = !o.childProps && !o.childNodes;
  path += isLastLevel ? o.name : o.name + ', ';

  if (o.childProps) 
    o.childProps.forEach(props => 
      props.prop_list.forEach(prop => 
        findName(prop, path);
      );
    );
  

  if (o.childNodes) 
    o.childNodes.forEach(node => 
      findName(node, path);
    );
  

  if (isLastLevel) 
    console.log(path);
  
)(obj);

【讨论】:

非常感谢!正是我想要的。 这就是我所说的遍历。【参考方案2】:

也许您可以采用更通用的方法来使用 recusion 来实现这一点,以便您的遍历适用于任何格式的输入数据:

function printPaths(node, path) 

  const nodeName = node.name ? (path ? ',' : '') + node.name : ''
  const nodePath = (path ? path : '') + nodeName  
  const nodeChildren = Object.values(node).filter(Array.isArray).flat()

  return nodeChildren.length > 0 ? nodeChildren
  .map(nodeChild => printPaths(nodeChild, nodePath)).flat() : nodePath

此解决方案与您的特定输入数据格式分离,这意味着它将检查当前的node 对象并遍历找到的任何数组值,最终返回所有发现的路径:

var input = 
  name: "A",
  childNodes: [
    name: "B",
    childProps: [
      prop_list: [
        name: "BS1"
      , 
        name: "BS2"
      ]
    ],
    childNodes: [
      name: "C",
      childProps: [
        prop_list: [
          name: "CS1"
        , 
          name: "CS2"
        ]
      ],
    ]
  ],
  childProps: [
    prop_list: [
      name: "AS1"
    , 
      name: "AS2"
    ]
  ]


function printPaths(node, path) 
  
  const nodeName = node.name ? (path ? ',' : '') + node.name : ''
  const nodePath = (path ? path : '') + nodeName  
  const nodeChildren = Object.values(node).filter(Array.isArray).flat()
    
  return nodeChildren.length > 0 ? nodeChildren
  .map(nodeChild => printPaths(nodeChild, nodePath)).flat() : nodePath


console.log( printPaths(input) )

【讨论】:

以上是关于Javascript:打印 JSON 树中的所有路径,包括数组的主要内容,如果未能解决你的问题,请参考以下文章

hihoCoder week11 树中的最长路

JavaScript 列出DOM树中的所有ID

hiho #1050 : 树中的最长路 树的直径

尝试使用递归从嵌套的 javascript 对象树中提取项目

如何从 JSON 树中检索特定的 id

题解报告:hihoCoder #1050 : 树中的最长路