>source
{
"groups": [
    {
        "name": "Event",
        "groups": [
            {
                "name": "Service",
                "subscriptions": [
                    {
                        "topic": "SERVICE_STATUS_PRESETS"
                    },
                    {
                        "topic": "AIRCRAFT_ACTIVATION",
                    },
                    {
                        "topic": "OUT_OF_SERVICE",
                    }
                ]
            }
        ]
    },
    {
        "name": "Enquiries",
        "groups": [
            {
                "name": "Service-related",
                "subscriptions": [
                    {
                        "topic": "PROMO_CODES_REQUESTS",
                    }
                ]
            }
        ]
    }
],
"subscriptions": [
    {
        "topic": "BANNERS",
    },
    {
        "topic": "DOCUMENTS",
    },
    {
        "topic": "USER",
    }
]

}

OK 얘들 아 내가 필요한 JSON 구조를 가지고 있습니다 : 배열의 모든 주제를 반환하십시오.이 예제에서는 다음과 같습니다.

[ "SERVICE_STATUS_PRESETS", "AIRCRAFT_ACTIVATION", "OUT_OF_SERVICE", "PROMO_CODES_REQUESTS", "BANNERS", "DOCUMENTS", "USER"]

마지막 세 개의 레코드 만 얻지 만 이와 같은 재귀 호출을 시도합니다.

getRecursive() {
if (Array.isArray(data)) {
       for (let i = 0; i < data.length; i++) {
         if (data[i].subscriptions) {
           return data[i].subscriptions.map((val: SubscriptionGroupDetails) => val.topic);
         } else if (data[i].groups) {
           return this.getAllTopics(data[i].groups);
         }
       }
     }
     if (data && data.groups) {
      return this.getAllTopics(data.groups);
     }
     return data.subscriptions.map((val: SubscriptionGroupDetails) => val.topic);
}


  • 답변 # 1

    재귀 적 접근 방식을 취하고

    건네받은 데이터가 검사 대상이 아닌 경우 빈 배열로 반환합니다.

    객체에 원하는 속성이 있으면 다음 값을 가진 배열을 반환합니다. topic ,

    또는 값을 가져 와서 함수로 재귀 호출을하고 그 결과로 배열을 반환합니다.

    function getTopics(object) {
        if (!object || typeof object !== 'object') return [];
        if ('topic' in object) return [object.topic];
        return Object.values(object).reduce((r, v) => [...r, ...getTopics(v)], []);
    }
    var data = { groups: [{ name: "Event", groups: [{ name: "Service", subscriptions: [{ topic: "SERVICE_STATUS_PRESETS" }, { topic: "AIRCRAFT_ACTIVATION" }, { topic: "OUT_OF_SERVICE" }] }] }, { name: "Enquiries", groups: [{ name: "Service-related", subscriptions: [{ topic: "PROMO_CODES_REQUESTS" }] }] }], subscriptions: [{ topic: "BANNERS" }, { topic: "DOCUMENTS" }, { topic: "USER" }] },
        result = getTopics(data);
    console.log(result);
    
    

  • 답변 # 2

    편집하다:다른 방법으로 추가.줄이다()

    빈 배열을 만들 수 있습니다. topics 그런 다음 중첩 구조를 재귀 적으로 탐색하고, 발견 할 때마다 주제를 추가하고, javascript .forEach ()를 사용하여 중첩 된 구조를 순환합니다. groups 또는 subscriptions .

    let topics = [];
    let findTopics = obj => {
       if (obj.groups) {
          obj.groups.forEach(findTopics);
       }
       if (obj.subscriptions) {
          obj.subscriptions.forEach(findTopics);
       }
       if (obj.topic) {
          topics.push(obj.topic);
       }
    }
    findTopics(data);
    
    

    또는 .reduce ()를 사용하는 더 깔끔한 방법 :

    let findTopicsRecursive = (topics, obj) => {
       if (obj.groups) {
          topics = obj.groups.reduce(findTopicsRecursive, topics);
       }
       if (obj.subscriptions) {
          topics = obj.subscriptions.reduce(findTopicsRecursive, topics);
       }
       if (obj.topic) {
          topics.push(obj.topic);
       }
       return topics;
    }
    let findTopics = data => findTopicsRecursive([], data);
    let topics = findTopics(data);
    
    

  • 답변 # 3

    이것을 사용하십시오 :

    function getTopics(obj){
       if(typeof obj !== 'object') return [];
       if(obj.topic) return [obj.topic];
       var res = [];
       for(var i in obj){
         res.push(...getTopics(obj[i]));
       }
       return res;
    }
    
    

    작업 예 :

    const topics = {
    "groups": [
        {
            "name": "Event",
            "groups": [
                {
                    "name": "Service",
                    "subscriptions": [
                        {
                            "topic": "SERVICE_STATUS_PRESETS"
                        },
                        {
                            "topic": "AIRCRAFT_ACTIVATION",
                        },
                        {
                            "topic": "OUT_OF_SERVICE",
                        }
                    ]
                }
            ]
        },
        {
            "name": "Enquiries",
            "groups": [
                {
                    "name": "Service-related",
                    "subscriptions": [
                        {
                            "topic": "PROMO_CODES_REQUESTS",
                        }
                    ]
                }
            ]
        }
    ],
    "subscriptions": [
        {
            "topic": "BANNERS",
        },
        {
            "topic": "DOCUMENTS",
        },
        {
            "topic": "USER",
        }
    ]
    }
    function getTopics(obj){
      if(typeof obj !== 'object') return [];
      if(obj.topic) return [obj.topic];
      var res = [];
      for(var i in obj){
        res.push(...getTopics(obj[i]));
      }
      return res;
    }
    
    console.log(getTopics(topics));
    
    

  • 답변 # 4

    관심이 있다면 기능적인 접근 방식을 취하는이 버전. 위에 다른 것들이 있지만 이것은 그것을 보는 또 다른 방법입니다.

    const recursion = object => Object.entries(object).map(([a, b]) => {
      if (a === 'topic') return b;
      if (Array.isArray(b)) return b.map(recursion);
      return [];
    }).flat(Infinity);
    recursion(obj);
    
    

  • 답변 # 5

    다음은 개체 스캔을 사용하는 솔루션입니다.

    // const objectScan = require('object-scan');
    const data = {"groups":[{"name":"Event","groups":[{"name":"Service","subscriptions":[{"topic":"SERVICE_STATUS_PRESETS"},{"topic":"AIRCRAFT_ACTIVATION"},{"topic":"OUT_OF_SERVICE"}]}]},{"name":"Enquiries","groups":[{"name":"Service-related","subscriptions":[{"topic":"PROMO_CODES_REQUESTS"}]}]}],"subscriptions":[{"topic":"BANNERS"},{"topic":"DOCUMENTS"},{"topic":"USER"}]};
    const searchTopics = (obj) => objectScan(['**.topic'], { rtn: 'value' })(obj);
    console.log(searchTopics(data));
    /* => [
      'USER',
      'DOCUMENTS',
      'BANNERS',
      'PROMO_CODES_REQUESTS',
      'OUT_OF_SERVICE',
      'AIRCRAFT_ACTIVATION',
      'SERVICE_STATUS_PRESETS'
    ] */
    
    
    <script src="https://bundle.run/object-scan@13.6.9"></script>
    
    

    부인 성명: 저는 object-scan의 저자입니다.

  • 이전 파이썬에서 서버가 닫힌 후 클라이언트 소켓이 서버를 계속 수신하도록하려면 어떻게해야합니까?
  • 다음 ibm cloud - ibm watson iot 플랫폼 - 닫힌 연결 : 작업이 승인되지 않았습니다