Front-end/Vanilla JS

js, json의 길이 추측

philo0407 2020. 11. 11. 21:36

기존에 알고 있던 코드를 개량하여,

json의 길이를 추측하는 코드를 짜 보았다.

number는 4,

string은 1,

그 이외에는 1..

좀 작게 추정해 본 것이다.

 

var swCho = {name: 'sw.Cho'
    , age: 99
    , size: {tall: 200, weight: 100}
    , hobby: 'show Youtube'
    , future: 'to be chicken King'};

위는 샘플 코드이다.

 

var deepCopyObj = (target) => {
    var r = [];
    if(typeof target !== 'object' || target === null)
        return target;
    for(i in target) {
        r[i] = deepCopyObj( target[i] );
    }
    return r;
}

위의 코드를 이용하였다. (Core JavaScript - 정재남.. 감사합니다!!)

사실.. 위의 코드가 트리구조를 탐색한다는 것을 깨닫지 못한다면,

직접 깊이/너비 우선탐색을 공부해서 만들었을지도 모른다... 감사합니다 ㅠㅠ..

저 코드를 직접 짜 보았길 정말 다행이야..

 

var totalSize = 0;
var knowType = (target) => {
    var r = [];

    if(typeof target !== 'object' ||  target === null) {
        var elementSize = 0;
        console.log(`typeof target : ${typeof target}`);

        if(typeof target === "string"){
            elementSize = target.length;
        }
        else if(typeof target === "number") {
            elementSize = 4;
        }
        else{
            elementSize = 1;
        }

        totalSize += elementSize;
        console.log(`totalSize : ${totalSize}`)
        return `${typeof target}, ${elementSize}`;
    }
    for(i in target) {
        r[i] = knowType( target[i] );
        //console.log(r);
        //console.log(`${i} : ${target[i]}`); 
    }
    return r;
}

// output
var s = knowType(swCho);
console.log(totalSize); // 48

그리고 위를 더 개량한 코드.. 속성값의 character Length를 재었다..

 

 

var totalSize = 0;
var knowType = (target) => {
    var result = [];
    var elementSize = 0;
    if(typeof target !== 'object' ||  target === null) {
        
        console.log(`typeof target : ${typeof target}`);

        if(typeof target === "string"){
            elementSize = target.length;
        }
        else if(typeof target === "number") {
            elementSize = 4;
        }
        else{
            elementSize = 1;
        }

        totalSize += elementSize;
        //console.log(`totalSize : ${totalSize}`);
        console.log(`target : ${target}, elementSize : ${elementSize}`);
        return `${typeof target}, ${elementSize}`;
    }
    for(key in target) {
        debugger;
        result[key] = knowType( target[key] );
        elementSize = key.length;
        console.log(`key : ${key}, key.len : ${key.length}`);
        totalSize += elementSize;
        //console.log(result);
        //console.log(`${key} : ${target[key]}`); 
    }
    return result;
}

 

이론상 swCho의 길이는 총 80이 나와야 한다.. 그러나 82가 나온다.

이는 size, tall, weight이 아닌, tall, weight, weight이 나오기 때문. 이것의 이유는

key값이 클로저의 성질(i : 내부의 변수가 없을 경우 외부의 변수를 참조한다)에 따르기 떄문..

key값이 size를 그대로 못 가지고 있기 때문에 weight을 가져온다.

 

var totalSize = 0;
var knowType = (target) => {
    var result = [];
    var elementSize = 0;
    if(typeof target !== 'object' ||  target === null) {
        
        console.log(`typeof target : ${typeof target}`);

        if(typeof target === "string"){
            elementSize = target.length;
        }
        else if(typeof target === "number") {
            elementSize = 4;
        }
        else{
            elementSize = 1;
        }

        totalSize += elementSize;
        //console.log(`totalSize : ${totalSize}`);
        console.log(`target : ${target}, elementSize : ${elementSize}`);
        return `${typeof target}, ${elementSize}`;
    }
    for(key in target) {
        debugger;
        elementSize = key.length;
        console.log(`key : ${key}, key.len : ${key.length}`);
        totalSize += elementSize;
        result[key] = knowType( target[key] );
        
        //console.log(result);
        //console.log(`${key} : ${target[key]}`); 
    }
    return result;
}

console.log(totalSize); // 80

 

코드를 정리하자.

 

var totalSize = 0;
var knowType = (target) => {
    var result = [];
    var elementSize = 0;
    
    if(typeof target !== 'object' ||  target === null) {

        if(typeof target === "string"){
            elementSize = target.length;
        } else if(typeof target === "number") {
            elementSize = 4;
        } else{
            elementSize = 1;
        }
        totalSize += elementSize;
        return `${typeof target}, ${elementSize}`;
    }

    // object인 경우
    for(key in target) {
        elementSize = key.length;
        totalSize += elementSize;
        result[key] = knowType( target[key] );
    }
    return result;
}

 

 

 

JavaScript data types and data structures

Programming languages all have built-in data structures, but these often differ from one language to another. This article attempts to list the built-in data structures available in JavaScript and what properties they have. These can be used to build other

developer.mozilla.org

 

 

 

배열 · JavaScript로 만나는 세상

No results matching ""

helloworldjavascript.net

 

 

 

[JavaScript] 문자열의 바이트(Byte) 길이를 구하는 방법

인터넷 상에 문자열의 Byte 길이를 체크하는 루틴이 다양하게 공개되어 있는데, 대부분은 for문을 돌려서 2바이트 문자들을 구분하고 값을 더하는 형태로 구현되어 있다. 더 좋은 방법은 없을까하

programmingsummaries.tistory.com