【问题标题】:Adding Depth or Parent Count attribute to nested JSON data将深度或父计数属性添加到嵌套 JSON 数据
【发布时间】:2018-02-02 02:34:53
【问题描述】:

我有一个这样的嵌套位置的 JSON 结构:(注意,这是伪 json,不是实际的 json)

location : "Location Parent"
locationid : 100
parent_location_id: ''

SUBLOCATIONS : Array(2)
    location : "Location Child"
    locationid : 200
    parent_location_id: 100

    location : "Location Child Two"
    locationid : 300
    parent_location_id: 100

location : "Location Parent Two"
locationid : 101
parent_location_id: ''

SUBLOCATIONS : Array(2)
    location : "Location Child"
    locationid : 201
    parent_location_id: 101

    location : "Location Child Two"
    locationid : 301
    parent_location_id: 101

    SUBLOCATIONS : Array(2)
        location : "Location Sub Child"
        locationid : 401
        parent_location_id: 301

        location : "Location Sub Child Two"
        locationid : 501
        parent_location_id: 301

我希望能够通过这些数据进行递归,并为每个项目添加一个属性,以表示其在层次结构中的位置或深度,所以最后,我会有这样的东西:

location : "Location Parent"
locationid : 100
parent_location_id : ''
level: 1

SUBLOCATIONS : Array(2)
    location : "Location Child"
    locationid : 200
    parent_location_id : 100
    level: 2

    location : "Location Child Two"
    locationid : 300
    parent_location_id : 100
    level: 2

location : "Location Parent Two"
locationid : 101
parent_location_id : ''
level: 1

SUBLOCATIONS : Array(2)
    location : "Location Child"
    locationid : 201
    parent_location_id : 101
    level: 2

    location : "Location Child Two"
    locationid : 301
    parent_location_id : 101
    level: 2

    SUBLOCATIONS : Array(2)
        location : "Location Sub Child"
        locationid : 401
        parent_location_id: 301
        level: 3

        location : "Location Sub Child Two"
        locationid : 501
        parent_location_id: 301
        level: 3

我可以通过这样的结构递归:

  recursivelyTraverseLocations(locations) {

        for (let location of locations) {

            if (location.parent_location_id > 0) {
                location.level = _depth_
            } else {
                location.level = 1
            }

            if (location.SUBLOCATIONS) {
                this.recursivelyTraverseLocations(location.SUBLOCATIONS);
            }
        }
      }

但我不知道如何初始化和限定 depth 变量以计算它在递归中的深度,并在它到达底部并从顶部开始时重置一个新的分支。

【问题讨论】:

  • 1开头,作为参数传递给递归方法
  • 那不是JSON“JSON 是一种文本、语言无关的数据交换格式,很像 XML、CSV 或 YAML。” - What is the difference between JSON and Object Literal Notation?
  • @Andreas - 我从 JSON 格式的服务中获取数据,然后可能通过将其分配给一个变量,它就变成了一个简单的 JavaScript 对象,所以正确的标题应该是“添加深度或父计数”属性到嵌套的 JavaScript 对象结构'?我在顶部注意到我的示例是伪 json,但我不确定如何最准确地描述这一点。谢谢!
  • 好吧,如果您从服务中获取 JSON 格式的数据,为什么不能将该 JSON 复制并粘贴到问题中?为什么让我们看伪代码?或者只是把花括号和方括号放在那里并称之为 JavaScript 对象?
  • 无论如何,This question and its answers 应该可以帮助您找到答案。

标签: javascript json recursion


【解决方案1】:

其中data 是从服务返回的,iteratorDepth 被定义为私有变量:

呼叫:

this.locations = this.recursivelyTraverseLocations(data,1)

并修改函数以interatorDepth为参数

this.recursivelyTraverseLocations(locations, iteratorDepth) {

        for (let location of locations) {

            if (location.parent_location_id > 0) {
                location.level = iteratorDepth
            } else {
                location.level = 1
            }

            if (location.SUBLOCATIONS) {
                this. this.recursivelyTraverseLocations(location.SUBLOCATIONS, iteratorDepth+1);
            }
        }
        return locations;
    }

这会正确设置层次结构中每个对象的级别属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2019-05-05
    • 1970-01-01
    • 2014-06-10
    相关资源
    最近更新 更多