순회 불가한 계층형 자바스크립트 객체를 1차원으로 정리해주는 함수입니


(디스프로그래머) #1
var testObj = {
    "id": 1,
    "name": "Leanne Graham",
    "username": "Bret",
    "email": "[email protected]",
    "address": {
        "street": "Kulas Light",
        "suite": "Apt. 556",
        "city": "Gwenborough",
        "zipcode": "92998-3874",
        "geo": {
            "lat": "-37.3159",
            "lng": "81.1496"
            }
        },
    "phone": "1-770-736-8031 x56442",
    "website": "hildegard.org",
    "company": {
        "name": "Romaguera-Crona",
        "catchPhrase": "Multi-layered client-server neural-net",
        "bs": "harness real-time e-markets"
    }
};

처럼 생긴 계층형 객체가 있다고 했을 때

function jsonSpliter(object, result){
    Object.keys(object).map(function (key) {
        if(typeof object[key] === 'object'){
            jsonSpliter(object[key], result);
        }else{
            result[key] = object[key];
        }
    });
    return result;
}

var funcTest = jsonSpliter(testObj, {});
console.log(funcTest);

이 함수를 사용하면 1차원으로 정리된 결과값을 반환받을 수 있습니다. 필요해서 만들었는데 유용하게 쓰일 수 있을 것 같아 처음으로 글을 남겨봅니다!


(이종은(Jong Lee)) #2

공유 감사합니다. :slight_smile:
그런데 키가 중복될 경우 덮어써지는 문제가 있겠네요. 위의 예제의 경우 "name": "Leanne Graham",는 사라지고 "company": { "name": "Romaguera-Crona",이 덮어써집니다.


(디스프로그래머) #3

네 사실 해당 부분에 대해선 블로그에 자세히 기고해놓기는 했는데 뭔가 블로그 링크 남기는게 블로그 홍보처럼 비춰질까봐 해당부분에 대해선 따로 글을 남겨두진 않았습니다… 하하
어찌보면 제반사항과 관련된 부분이라 남겨둘 걸 그랬네요. 댓글남겨주셔서 감사합니다.
블로그
구현과정 및 자세한 내용은 여기에서 살펴보실 수 있습니다!


(이종은(Jong Lee)) #4

커뮤니티와 관련 있는 정보를 공유하면서 블로그 링크도 함께 남기는 것은 전혀 문제가 되지 않습니다. :slight_smile:

공유해주신 코드에 위 문제를 해결하기 위해 재귀할 때 prefix를 만들어서 넘기도록 변경해봤습니다. 이렇게 하면 이름 중복 없이 { adress : { name: 'yo'}}adress#name로 나오게 됩니다.

function jsonSpliter(object, result, prefix=''){
    Object.keys(object).map(function (key) {
        if(typeof object[key] === 'object'){
            jsonSpliter(object[key], result, prefix+key+'#');
        }else{
            result[prefix+key] = object[key];
        }
    });
    return result;
}

(디스프로그래머) #5

오 좋은 아이디어 같아요! 개선 감사합니다!