깊이 중첩 된 객체를 재귀 적으로 중첩 해제하는 방법은 무엇입니까?

제임스 바라카

예측할 수없는 중첩 의 여러 개체 / 배열을 가질 수있는 배열로 작업하고 있습니다. 각 객체는 항상 name속성을 가지며 이러한 객체 중 일부는의 배열을 가질 수 있습니다 sub_fields. name원본의 중첩 수준을 유지하면서 각 개체의 키가 속성과 같도록 개체를 제거하고 싶습니다 .

다음은 제가 시작할 수있는 예입니다.

var data = [
    {
        foo: 'foo',
        bar: 'bar',
        name: 'Object 1'
    },
    {
        foo: 'foo',
        bar: 'bar',
        name: 'Object 2'
    },
    {
        foo: 'foo',
        bar: 'bar',
        name: 'Object 3',
        sub_fields : [
            {
                foo: 'foo',
                bar: 'bar',
                name: 'SubLevel Object 1',
                sub_fields: [
                    {
                        foo: 'foo',
                        bar: 'bar',
                        name: 'SubLevel Object 1',
                    }
                ]
            },
            {
                foo: 'foo',
                bar: 'bar',
                name: 'SubLevel Object 2',
                sub_fields: [
                    {
                        foo: 'foo',
                        bar: 'bar',
                        name: 'SubLevel Object 1',
                    },
                    {
                        foo: 'foo',
                        bar: 'bar',
                        name: 'SubLevel Object 2',
                    },
                    {
                        foo: 'foo',
                        bar: 'bar',
                        name: 'SubLevel Object 3',
                        sub_fields: [
                            {
                                foo: 'foo',
                                bar: 'bar',
                                name: 'SubLevel Object 1'
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

이상적으로는 원본 데이터를 가져와 다음과 같이 만드는 것을 목표로합니다.

var newData = {
    'Object 1': null,
    'Object 2': null,
    'Object 3': {
        'Sublevel Object 1': {
            'Sublevel Object 1': null
        },
        'Sublevel Object 2': {
            'Sublevel Object 1': null,
            'Sublevel Object 2': null,
            'Sublevel Object 3': {
                  'Sublevel Object 1': null
             }
        }
    }
}

재귀 함수가 있어야한다는 것을 알면서 너무 많은 시간을 보낸 것 같습니다 .--- 제가 고군분투하고있는 종류에 대해 너무 경험이 없습니다. 해결책을 찾으십시오.

누군가 내가 무엇을 할 수 있는지 보여줄 수 있습니까?

편집 여기에 내가 시도한 것입니다. 그것은 혼란스럽고 너무 단편적입니다 --- 사실 당황 스럽습니다 ---하지만 선의로, 나는 당신이 이것을 스스로 알아 내려고 노력하지 않았다고 생각하는 것을 원하지 않았습니다.

(또한 구문 분석되는 "field_group"은 위의 "foo / bar"예제가 아니라 내가 작업중인보다 관련성 높은 JSON 데이터에서 가져온 것입니다.)

var parsed_field_group = JSON.parse(JSON.stringify(field_group));
var fields = field_group[0].fields;

function removeKeys(obj, keys) {
    for (var prop in obj) {
        if(obj.hasOwnProperty(prop)) {
            switch(typeof(obj[prop])) {
                case 'object':
                    if(keys.indexOf(prop) > -1) {
                        delete obj[prop];
                    } else {
                        removeKeys(obj[prop], keys);
                    }
                    break;
                default:
                    if(!keys.includes(prop)) {
                        delete obj[prop];
                    }
                    break;
            }
        }
    }
}

removeKeys(fields, ['name', 'wrapper'])

console.log(fields)

var newJson = Object.create(null);
fields.forEach(field => {
    if (field.hasOwnProperty('sub_fields')) {
        newJson[field.name] = field
    } else {
        newJson[field.name] = null
    }
})

function handleSubFields(obj, key) {
    for (var prop in obj) {
        if (obj[prop]) {
            obj[prop][key].forEach(field => {
                if (field.hasOwnProperty(key)) {
                    obj[prop][field.name] = field
                } else {
                    obj[prop][field.name] = null
                }
            })
            delete obj[prop][key]
            delete obj[prop].name
        }
    }
}
handleSubFields(newJson, 'sub_fields')

console.log(newJson)

위의 내용은 나를 매우 가깝게 만들었지 만 결국 객체의 첫 번째 sub_field 안에 중첩 된 sub_fields에 갇히게됩니다.

위의 내용이 웃을 수 있음을 알고 있습니다. 친절하세요! :-)

VLAZ

예, 재귀를 사용하면 매우 쉽습니다. 기본 사례는 다음과 같습니다.

  • 당신은 물건이 아닌 무언가를받습니다-당신은 반환 null합니다.

그런 다음 기본 재귀 사례 :

  • 객체를 받고 객체의 속성을 사용하여 새 객체를 생성합니다 name. 값은 함수의 재귀 적 적용입니다.

마지막으로 배열이있는 경우 발생하는 작업을 처리해야합니다.

  • 전체 배열을 살펴보고 각 요소에 대해 함수를 호출합니다. 모든 결과를 동일한 개체에 수집합니다.

var data = [{ foo: 'foo', bar: 'bar', name: 'Object 1' }, { foo: 'foo', bar: 'bar', name: 'Object 2' }, { foo: 'foo', bar: 'bar', name: 'Object 3', sub_fields: [{ foo: 'foo', bar: 'bar', name: 'SubLevel Object 1', sub_fields: [{ foo: 'foo', bar: 'bar', name: 'SubLevel Object 1', }] }, { foo: 'foo', bar: 'bar', name: 'SubLevel Object 2', sub_fields: [{ foo: 'foo', bar: 'bar', name: 'SubLevel Object 1', }, { foo: 'foo', bar: 'bar', name: 'SubLevel Object 2', }, { foo: 'foo', bar: 'bar', name: 'SubLevel Object 3', sub_fields: [{ foo: 'foo', bar: 'bar', name: 'SubLevel Object 1' }] } ] } ] } ]


function toObj(data) {
  if (data == null) return null;
  
  //collect all recursive calls to the function in the same object
  if (Array.isArray(data))
    return data.reduce((acc, data) => ({ ...acc, ...toObj(data)}), {})
  
  //produce a new object from the `name` property and a recursive application of the function
  return { [data.name]: toObj(data.sub_fields, {}) };
}

console.log(toObj(data))

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

중첩 된 객체의 모든 키를 재귀 적으로 가져 오는 방법은 무엇입니까?

분류에서Dev

객체를 중첩 객체로 나누는 방법은 무엇입니까? (재귀적인 방법)

분류에서Dev

레벨 수에 관계없이 중첩 된 해시를 : [] 메소드로 재귀 적으로 보내는 방법은 무엇입니까?

분류에서Dev

재귀 함수를 사용하여 중첩 배열 객체를 플랫 테이블 angularjs로 동적으로 변환하는 방법은 무엇입니까?

분류에서Dev

임의의 깊이로 깊이 중첩 된 Hashtable에서 값을 검색하는 방법은 무엇입니까?

분류에서Dev

Immutable JS-선언적 방식으로 깊게 중첩 된 객체에서 값을 추출하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

중첩 된 하위 디렉터리를 재귀 적으로 검색하고 각각에 대해 명령을 실행하는 방법이 있습니까?

분류에서Dev

JSONata를 사용하여 중첩 된 개체를 단일 깊이 개체로 병합하는 방법은 무엇입니까?

분류에서Dev

Javascript : 중첩 된 개체를 다른 개체로 재구성하는 방법은 무엇입니까?

분류에서Dev

안드로이드의 중첩 된 객체에서 setter에 액세스하는 방법은 무엇입니까?

분류에서Dev

현재가 깊게 중첩 된 경우 루트 ViewController로 돌아가는 방법은 무엇입니까?

분류에서Dev

중첩 된 객체 양식 angularjs를 재설정하는 방법은 무엇입니까?

분류에서Dev

교착 상태로 이어지는 중첩 된 모니터를 이해하는 방법은 무엇입니까?

분류에서Dev

이 중첩 된 개체를 반복하는 방법은 무엇입니까?

분류에서Dev

탄력적 검색에서 중첩 된 JSON 객체 / 필드를 쿼리하는 방법은 무엇입니까?

분류에서Dev

양식 패널 제출시 중첩 된 JSON 데이터를 Java 객체로 변환하는 방법은 무엇입니까?

분류에서Dev

rxjs 연산자, 단일 객체에 중첩 된 데이터를 반환하는 방법은 무엇입니까?

분류에서Dev

React로 handleChange에 중첩 된 객체를 빌드하는 방법은 무엇입니까?

분류에서Dev

중첩 된 데이터로 firebase에서 부모를 제거하는 방법은 무엇입니까?

분류에서Dev

중첩 된 JSON 페이로드 (JavaScript)에서 특정 요소를 제거하는 방법은 무엇입니까?

분류에서Dev

중첩 된 개체를 동적으로 만드는 방법은 무엇입니까?

분류에서Dev

깊이를 알 수없는 깊이 중첩 된 사전에서 비어 있거나 없음 필드를 제거하는 방법은 무엇입니까?

분류에서Dev

중첩 된 Python 사전에서 가장 깊은 키를 명시 적으로 인스턴스화 할 필요가없는 이유는 무엇입니까?

분류에서Dev

중첩 된 개체를 배열로 바꾸는 방법은 무엇입니까?

분류에서Dev

중첩 된 JSON 배열 데이터를 표 형식으로 인쇄하는 방법은 무엇입니까?

분류에서Dev

중첩 된 dict를 pandas 데이터 프레임으로 변환하는 방법은 무엇입니까?

분류에서Dev

중첩 된 JSON 배열 데이터를 표 형식으로 인쇄하는 방법은 무엇입니까?

분류에서Dev

ObjectId를 기반으로 중첩 된 개체를 삭제하는 방법은 무엇입니까?

분류에서Dev

Python의 재귀 함수에 중첩 된 데이터 프레임 groupby 루프를 통합하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    중첩 된 객체의 모든 키를 재귀 적으로 가져 오는 방법은 무엇입니까?

  2. 2

    객체를 중첩 객체로 나누는 방법은 무엇입니까? (재귀적인 방법)

  3. 3

    레벨 수에 관계없이 중첩 된 해시를 : [] 메소드로 재귀 적으로 보내는 방법은 무엇입니까?

  4. 4

    재귀 함수를 사용하여 중첩 배열 객체를 플랫 테이블 angularjs로 동적으로 변환하는 방법은 무엇입니까?

  5. 5

    임의의 깊이로 깊이 중첩 된 Hashtable에서 값을 검색하는 방법은 무엇입니까?

  6. 6

    Immutable JS-선언적 방식으로 깊게 중첩 된 객체에서 값을 추출하는 가장 좋은 방법은 무엇입니까?

  7. 7

    중첩 된 하위 디렉터리를 재귀 적으로 검색하고 각각에 대해 명령을 실행하는 방법이 있습니까?

  8. 8

    JSONata를 사용하여 중첩 된 개체를 단일 깊이 개체로 병합하는 방법은 무엇입니까?

  9. 9

    Javascript : 중첩 된 개체를 다른 개체로 재구성하는 방법은 무엇입니까?

  10. 10

    안드로이드의 중첩 된 객체에서 setter에 액세스하는 방법은 무엇입니까?

  11. 11

    현재가 깊게 중첩 된 경우 루트 ViewController로 돌아가는 방법은 무엇입니까?

  12. 12

    중첩 된 객체 양식 angularjs를 재설정하는 방법은 무엇입니까?

  13. 13

    교착 상태로 이어지는 중첩 된 모니터를 이해하는 방법은 무엇입니까?

  14. 14

    이 중첩 된 개체를 반복하는 방법은 무엇입니까?

  15. 15

    탄력적 검색에서 중첩 된 JSON 객체 / 필드를 쿼리하는 방법은 무엇입니까?

  16. 16

    양식 패널 제출시 중첩 된 JSON 데이터를 Java 객체로 변환하는 방법은 무엇입니까?

  17. 17

    rxjs 연산자, 단일 객체에 중첩 된 데이터를 반환하는 방법은 무엇입니까?

  18. 18

    React로 handleChange에 중첩 된 객체를 빌드하는 방법은 무엇입니까?

  19. 19

    중첩 된 데이터로 firebase에서 부모를 제거하는 방법은 무엇입니까?

  20. 20

    중첩 된 JSON 페이로드 (JavaScript)에서 특정 요소를 제거하는 방법은 무엇입니까?

  21. 21

    중첩 된 개체를 동적으로 만드는 방법은 무엇입니까?

  22. 22

    깊이를 알 수없는 깊이 중첩 된 사전에서 비어 있거나 없음 필드를 제거하는 방법은 무엇입니까?

  23. 23

    중첩 된 Python 사전에서 가장 깊은 키를 명시 적으로 인스턴스화 할 필요가없는 이유는 무엇입니까?

  24. 24

    중첩 된 개체를 배열로 바꾸는 방법은 무엇입니까?

  25. 25

    중첩 된 JSON 배열 데이터를 표 형식으로 인쇄하는 방법은 무엇입니까?

  26. 26

    중첩 된 dict를 pandas 데이터 프레임으로 변환하는 방법은 무엇입니까?

  27. 27

    중첩 된 JSON 배열 데이터를 표 형식으로 인쇄하는 방법은 무엇입니까?

  28. 28

    ObjectId를 기반으로 중첩 된 개체를 삭제하는 방법은 무엇입니까?

  29. 29

    Python의 재귀 함수에 중첩 된 데이터 프레임 groupby 루프를 통합하는 방법은 무엇입니까?

뜨겁다태그

보관