简体   繁体   English

获取JSON对象中的所有路径

[英]Get all paths in JSON object

Been messing with this for a while and can't get it right. 一直困扰着它,无法正确解决。 I'm trying to create arrays for every path from this JSON. 我正在尝试为此JSON中的每个路径创建数组。

[
  {
    "WebApp : calendar": {
      "count": 3151,
      "next": {
        "ViewWorkout": {
          "count": 521,
          "next": {
            "BeginUserSession": {
              "count": 12,
              "next": {}
            },
            "EditWorkout": {
              "count": 134,
              "next": {}
            },
            "WebApp : expandoOpened": {
              "count": 116,
              "next": {}
            },
            "Mobile : Feed": {
              "count": 2,
              "next": {}
            },
            "WebApp : athleteLoadedFromLibrary": {
              "count": 45,
              "next": {}
            },
            "ViewWorkout": {
              "count": 108,
              "next": {}
            },
            "WebApp : workoutQuickViewTabmapGraphClicked": {
              "count": 18,
              "next": {}
            },
            "DeleteWorkout": {
              "count": 9,
              "next": {}
            },
            "WebApp : headerWorkoutIconClicked": {
              "count": 3,
              "next": {}
            },
            "WebApp : notificationCenterOpened": {
              "count": 14,
              "next": {}
            },
            "WebApp : calendar": {
              "count": 3,
              "next": {}
            },
            "WebApp : workoutQuickViewTabsummaryClicked": {
              "count": 1,
              "next": {}
            },
            "AddWorkout": {
              "count": 8,
              "next": {}
            },
            "DeleteEvent": {
              "count": 1,
              "next": {}
            },
            "ViewWorkoutMapAndGraph": {
              "count": 2,
              "next": {}
            },
            "WebApp : fileUploadMenuOpened": {
              "count": 7,
              "next": {}
            },
            "WebApp : athleteSettingsLoadedFromLibrary": {
              "count": 1,
              "next": {}
            },
            "WebApp : workoutQuickViewTabpowerClicked": {
              "count": 2,
              "next": {}
            },
            "WebApp : distributionChartLoaded": {
              "count": 2,
              "next": {}
            },
            "WebApp : homeViewed": {
              "count": 2,
              "next": {}
            },
            "WebApp : loadNotificationFeedbackLocation": {
              "count": 3,
              "next": {}
            },
            "Mobile : athleteChanged": {
              "count": 1,
              "next": {}
            },
            "WebApp : workoutQuickViewTabheartrateClicked": {
              "count": 2,
              "next": {}
            },
            "WebApp : qvUnitsMenutUpdateUnitsToMetricClicked": {
              "count": 1,
              "next": {}
            },
            "WebApp : goToLastWeek": {
              "count": 4,
              "next": {}
            },
            "WebApp : createWorkoutFromLibrary": {
              "count": 2,
              "next": {}
            },
            "AddEvent": {
              "count": 1,
              "next": {}
            },
            "ViewAthleteList": {
              "count": 1,
              "next": {}
            },
            "WebApp : planLoadedFromLibrary": {
              "count": 2,
              "next": {}
            },
            "WebApp : enterFullScreen": {
              "count": 1,
              "next": {}
            },
            "WebApp : downloadFileClicked": {
              "count": 1,
              "next": {}
            },
            "WebApp : contextMenuOpened": {
              "count": 1,
              "next": {}
            }
          }
        },
        "WebApp : athleteLoadedFromLibrary": {
          "count": 1230,
          "next": {
            "WebApp : calendar": {
              "count": 1190,
              "next": {}
            },
            "WebApp : goToLastWeek": {
              "count": 3,
              "next": {}
            },
            "ViewWorkout": {
              "count": 12,
              "next": {}
            },
            "BeginUserSession": {
              "count": 7,
              "next": {}
            },
            "AddWorkout": {
              "count": 3,
              "next": {}
            },
            "WebApp : athleteLoadedFromLibrary": {
              "count": 7,
              "next": {}
            },
            "WebApp : refreshCalendar": {
              "count": 1,
              "next": {}
            },
            "WebApp : quickViewOpened": {
              "count": 1,
              "next": {}
            },
            "WebApp : notificationCenterOpened": {
              "count": 1,
              "next": {}
            },
            "WebApp : selectCalendarDate": {
              "count": 1,
              "next": {}
            },
            "WebApp : goToNextWeek": {
              "count": 1,
              "next": {}
            },
            "WebApp : createWorkoutFromLibrary": {
              "count": 1,
              "next": {}
            }
          }
        },
        "WebApp : notificationCenterOpened": {
          "count": 276,
          "next": {
            "WebApp : loadNotificationFeedbackLocation": {
              "count": 111,
              "next": {}
            },
            "WebApp : athleteLoadedFromLibrary": {
              "count": 76,
              "next": {}
            },
            "ViewWorkout": {
              "count": 19,
              "next": {}
            },
            "AddEvent": {
              "count": 1,
              "next": {}
            },
            "WebApp : notificationCenterOpened": {
              "count": 9,
              "next": {}
            },
            "AddWorkout": {
              "count": 5,
              "next": {}
            },
            "BeginUserSession": {
              "count": 16,
              "next": {}
            },
            "WebApp : calendar": {
              "count": 3,
              "next": {}
            },
            "WebApp : goToLastWeek": {
              "count": 2,
              "next": {}
            },
            "WebApp : addAthlete": {
              "count": 5,
              "next": {}
            },
            "$campaign_delivery": {
              "count": 1,
              "next": {}
            },
            "Mobile : Feed": {
              "count": 2,
              "next": {}
            },
            "WebApp : createWorkoutFromLibrary": {
              "count": 2,
              "next": {}
            },
            "WebApp : homeViewed": {
              "count": 1,
              "next": {}
            },
            "WebApp : dashboardViewed": {
              "count": 2,
              "next": {}
            },
            "WebApp : athleteSettingsLoadedFromLibrary": {
              "count": 3,
              "next": {}
            },
            "WebApp : calendarLoadedViaLoadDragNDrop": {
              "count": 2,
              "next": {}
            },
            "WebApp : groupLoadedFromLibrary": {
              "count": 1,
              "next": {}
            },
            "WebApp : workoutQuickViewTabpowerClicked": {
              "count": 1,
              "next": {}
            },
            "WebApp : refreshCalendar": {
              "count": 1,
              "next": {}
            },
            "CMS : Download Chart Exchange chart": {
              "count": 1,
              "next": {}
            },
            "WebApp : selectCalendarDate": {
              "count": 1,
              "next": {}
            }
          }
        },
        "WebApp : planLoadedFromLibrary": {
          "count": 24,
          "next": {
            "WebApp : calendar": {
              "count": 23,
              "next": {}
            },
            "AddTrainingPlanWorkout": {
              "count": 1,
              "next": {}
            }
          }
        }
      }
    }
  }
]

The real end goal is to visualize every path with D3, but right now I'm just trying to figure out how to loop through the data and get all possible paths. 真正的最终目标是使用D3可视化每条路径,但是现在我只是想弄清楚如何遍历数据并获取所有可能的路径。

Output should look something like this and take into account that their may be more levels of the same structure. 输出应该看起来像这样,并考虑到它们可能是同一结构的更多层。

WebApp : calendar (3151) -> ViewWorkout (521) -> BeginUserSession (12)
WebApp : calendar (3151) -> ViewWorkout (521) -> EditWorkout (134)
...
WebApp : calendar (3151) -> WebApp : athleteLoadedFromLibrary (1230) -> WebApp : calendar (731)

I think the following snippet does what you wanted. 我认为以下代码片段可以满足您的需求。

 function getPaths(o, root = "", result = []) { var ok = Object.keys(o); return ok.reduce((a,k) => { var p = root + k + "(" + o[k].count + ") -> "; Object.keys(o[k].next).length ? getPaths(o[k].next,p,a) : a.push(p); return a; },result); } var data = [ { "WebApp : calendar": { "count": 3151, "next": { "ViewWorkout": { "count": 521, "next": { "BeginUserSession": { "count": 12, "next": {} }, "EditWorkout": { "count": 134, "next": {} }, "WebApp : expandoOpened": { "count": 116, "next": {} }, "Mobile : Feed": { "count": 2, "next": {} }, "WebApp : athleteLoadedFromLibrary": { "count": 45, "next": {} }, "ViewWorkout": { "count": 108, "next": {} }, "WebApp : workoutQuickViewTabmapGraphClicked": { "count": 18, "next": {} }, "DeleteWorkout": { "count": 9, "next": {} }, "WebApp : headerWorkoutIconClicked": { "count": 3, "next": {} }, "WebApp : notificationCenterOpened": { "count": 14, "next": {} }, "WebApp : calendar": { "count": 3, "next": {} }, "WebApp : workoutQuickViewTabsummaryClicked": { "count": 1, "next": {} }, "AddWorkout": { "count": 8, "next": {} }, "DeleteEvent": { "count": 1, "next": {} }, "ViewWorkoutMapAndGraph": { "count": 2, "next": {} }, "WebApp : fileUploadMenuOpened": { "count": 7, "next": {} }, "WebApp : athleteSettingsLoadedFromLibrary": { "count": 1, "next": {} }, "WebApp : workoutQuickViewTabpowerClicked": { "count": 2, "next": {} }, "WebApp : distributionChartLoaded": { "count": 2, "next": {} }, "WebApp : homeViewed": { "count": 2, "next": {} }, "WebApp : loadNotificationFeedbackLocation": { "count": 3, "next": {} }, "Mobile : athleteChanged": { "count": 1, "next": {} }, "WebApp : workoutQuickViewTabheartrateClicked": { "count": 2, "next": {} }, "WebApp : qvUnitsMenutUpdateUnitsToMetricClicked": { "count": 1, "next": {} }, "WebApp : goToLastWeek": { "count": 4, "next": {} }, "WebApp : createWorkoutFromLibrary": { "count": 2, "next": {} }, "AddEvent": { "count": 1, "next": {} }, "ViewAthleteList": { "count": 1, "next": {} }, "WebApp : planLoadedFromLibrary": { "count": 2, "next": {} }, "WebApp : enterFullScreen": { "count": 1, "next": {} }, "WebApp : downloadFileClicked": { "count": 1, "next": {} }, "WebApp : contextMenuOpened": { "count": 1, "next": {} } } }, "WebApp : athleteLoadedFromLibrary": { "count": 1230, "next": { "WebApp : calendar": { "count": 1190, "next": {} }, "WebApp : goToLastWeek": { "count": 3, "next": {} }, "ViewWorkout": { "count": 12, "next": {} }, "BeginUserSession": { "count": 7, "next": {} }, "AddWorkout": { "count": 3, "next": {} }, "WebApp : athleteLoadedFromLibrary": { "count": 7, "next": {} }, "WebApp : refreshCalendar": { "count": 1, "next": {} }, "WebApp : quickViewOpened": { "count": 1, "next": {} }, "WebApp : notificationCenterOpened": { "count": 1, "next": {} }, "WebApp : selectCalendarDate": { "count": 1, "next": {} }, "WebApp : goToNextWeek": { "count": 1, "next": {} }, "WebApp : createWorkoutFromLibrary": { "count": 1, "next": {} } } }, "WebApp : notificationCenterOpened": { "count": 276, "next": { "WebApp : loadNotificationFeedbackLocation": { "count": 111, "next": {} }, "WebApp : athleteLoadedFromLibrary": { "count": 76, "next": {} }, "ViewWorkout": { "count": 19, "next": {} }, "AddEvent": { "count": 1, "next": {} }, "WebApp : notificationCenterOpened": { "count": 9, "next": {} }, "AddWorkout": { "count": 5, "next": {} }, "BeginUserSession": { "count": 16, "next": {} }, "WebApp : calendar": { "count": 3, "next": {} }, "WebApp : goToLastWeek": { "count": 2, "next": {} }, "WebApp : addAthlete": { "count": 5, "next": {} }, "$campaign_delivery": { "count": 1, "next": {} }, "Mobile : Feed": { "count": 2, "next": {} }, "WebApp : createWorkoutFromLibrary": { "count": 2, "next": {} }, "WebApp : homeViewed": { "count": 1, "next": {} }, "WebApp : dashboardViewed": { "count": 2, "next": {} }, "WebApp : athleteSettingsLoadedFromLibrary": { "count": 3, "next": {} }, "WebApp : calendarLoadedViaLoadDragNDrop": { "count": 2, "next": {} }, "WebApp : groupLoadedFromLibrary": { "count": 1, "next": {} }, "WebApp : workoutQuickViewTabpowerClicked": { "count": 1, "next": {} }, "WebApp : refreshCalendar": { "count": 1, "next": {} }, "CMS : Download Chart Exchange chart": { "count": 1, "next": {} }, "WebApp : selectCalendarDate": { "count": 1, "next": {} } } }, "WebApp : planLoadedFromLibrary": { "count": 24, "next": { "WebApp : calendar": { "count": 23, "next": {} }, "AddTrainingPlanWorkout": { "count": 1, "next": {} } } } } } } ], paths = getPaths(data[0]); console.log(paths); 

You have to call getPaths function with the root object as argument. 您必须使用根对象作为参数来调用getPaths函数。 In you case it would be like getPaths(data[0]); 在您的情况下,就像getPaths(data[0]); and result will be an array of all paths. 结果将是所有路径的数组。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM