{
"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
- 답변 # 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의 저자입니다.
관련 자료
- flutter - http 게시물 본문 내부에 큰 JSON 데이터를 보내는 방법
- Python의 JSON 파일에서 데이터 추출
- c# - 개체에 데이터를 삽입하는 방법
- java - JSON Array에서 특정 데이터를 보내는 방법
- API Python에서 JSON 데이터를 추출하는 방법
- ios - JSON 데이터를 Swift의 UserDefault에 저장하는 방법은 무엇입니까?
- c# - Json 개체를 형식으로 역 직렬화 할 수 없습니다
- javascript - JSON 배열에 데이터를 추가하는 방법
- python - JSON 객체를 맨 위로 이동하는 방법
- JSON에서 객체를 Java로 매핑하도록 변환
- javascript - 텍스트 데이터를 json 형식으로 변환
- vb.net - BIG JSON 데이터를 DataGridView로 역 직렬화하는 방법
- Ruby로 JSON 파일에 데이터를 추가/추가하는 방법
- ruby - Rails 응답으로 가짜 JSON 데이터를 보내는 방법
- 파이썬으로 JSON 데이터를 읽는 방법
- python - 이 json 데이터가로드되지 않는 이유는 무엇입니까?
- arrays - PHP에서 Json으로 데이터 수신
- html - Javascript를 사용하여 API에서 JSON 데이터를 가져 오는 방법은 무엇입니까?
- python - JSON 덤프를 객체로 디코딩
재귀 적 접근 방식을 취하고
건네받은 데이터가 검사 대상이 아닌 경우 빈 배열로 반환합니다.
객체에 원하는 속성이 있으면 다음 값을 가진 배열을 반환합니다.
topic
,또는 값을 가져 와서 함수로 재귀 호출을하고 그 결과로 배열을 반환합니다.