Monthly Archives: July 2014

Javascript의 Object를 다루는 몇가지 팁들

Node.js 의 등장으로 서버 사이드에서 프론트 엔드까지 Javascript로 코딩을 할 수 있는 시대가 왔습니다.  MongoDB라는 Javascript 형태의 데이터베이스를 포함하여 MEAN 스택(MongoDB + Express + AngularJS + Node.js)이라는 용어가 등장하기도 합니다.  Javascript로 클라이언트와 서버가 통신을 하다보니 Javascript의 Object를 얼마나 잘 다루느냐가 꽤나 중요한 문제가 되었습니다.

Javascript에서 Objcect와 Array 등을 다루는데 최고봉은 역시 Underscore입니다.  Node.js 에도 모듈 형태도 제공하고 있기 때문에 배워두면 여러모로 편리합니다(이걸 어디다 쓰지 싶은 기능들도 있는데 하다보면 신기하게도 쓸데가 있습니다…).  일단 Underscore에 관한 이야기는 나중에 하고 최근에 구글신과 스택오버플로우로부터 전해받은 은혜로운 복음(…)의 결과물을 정리해 봅니다.

1. Object의 key를 변수로 받기

 var person = {
  name : "neko",
  gender : "male"
};

console.log( person.name, person.gender );
// 결과 : neko male

var key1 = 'name', key2 = 'gender';

console.log( person[key1], person[key2] );
// 결과 : neko male
// 위와 동일한 결과를 얻을 수 있습니다.

 

2. key, value 값 얻어내기( = foreach )
애석하게도 Javascript에서 foreach가 없습니다.

var object = { ... };

for( var key in object ) {
  console.log( key + '=>' + object[key] );
}

 

3. 요소의 갯수 알아내기
배열의 경우에는 length로 쉽게 알아낼 수 있지만 Object에는 length가 없습니다.

var object = { ... };
var length = Object.keys( object ).length;

console.log( length );
// object의 요소 갯수가 반환됩니다.
// Object.keys()만 돌리게 되면 해당 Object의 value값만 배열로 반환이 됩니다.

 

4. 형 구분하기
JSON은 데이터를 주고받는데 매우 편리한 Data형식이지만 Node.js 서버에 JSON으로 데이터를 날리게되면 value가 전부 String으로 날아가는 경우가 있습니다. 이게 꽤나 난감한 것이 MongoDB에서는 $inc와 같이 value가 Number( Int, Float 등 )가 아니면 에러를 날리는 경우가 있기 때문에 최소한 수와 문자의 구분을 해주어야 합니다.

다음은 JSON 데이터의 value가 0으로 시작하지 않는 숫자들만의 조합으로 이루어 졌을때 정수형으로 변환한 후 이를 반환하는 함수입니다. 두번째 if문의 블럭의 조건과 구문을 조작하면 좀더 정교한 구분도 가능합니다(일단 편의상 정수 데이터만 날아온다고 가정했습니다. 전화번호 같이 0으로 시작하는 경우 이를 정수로 받으면 가장 앞 부분의 0이 생략되기 때문에 문자로 취급했습니다)

var typeCheck = function( jsonData ) {
  for( var key in jsonData ) {
    if( typeof jsonData[key] === 'object' || typeof jsonData[key] === 'array' ) {
      jsonData[key] = typeCheck( jsonData[key] );
    } else {
      if( /^(0|[1-9][0-9]*)$/.test( jsonData[key] ) ) {
        jsonData[key] = parseInt( jsonData[key] );
      }
    }
  }

  return jsonData;
}