json 객체 와일드카드 비스무리하게 사용하기

Mussyan 2021. 2. 17. 15:04

iot에 관한 프로젝트 진행 중

json 객체 내 다수의 timestamp 중 가장 높은 값을 찾을 일이 생겼다.

 

해당 json 객체의 형태는

{
  "metadata": {
    "desired": {
      "welcome": {
        "timestamp": 1613530483
      },
      "welcome2": {
        "timestamp": 1613530483
      },
      "welcome3": {
        "timestamp": 1613530483
      }
    },
    "reported": {
      "welcome": {
        "timestamp": 1613530483
      },
      "welcome3": {
        "timestamp": 1613530483
      },
      "welcome2": {
        "timestamp": 1613530483
      }
    }
  },
  "version": 11,
  "timestamp": 1613540953
}

위와 같은 형태이며 특징으로는 timestamp 바로 상위 key의 값이 정해지지 않았다는 점이다.

예시에서는 welcome, welcome2, welcome3가 있으나 대부분의 경우는 attribute의 개수 및 키값이 다를 것이다.

 

String 형태로 활용하여 timestamp가 포함된 행의 숫자를 읽어오는 방법이 떠올랐으나 너무 원시적인 것 같아서 json 객체 관점에서 해결하는 방법을 찾아보기로 하였다.

 

json 와일드카드에 관해 리서치를 진행해보던 중 map을 활용하는 방법을 발견하여 아래와 같이 해결하였다.

let lastTimeStamp = function(obj) {
  let lastUpdate = 0;
  Object.keys(obj).map(function(elem) {
    if(obj[elem].timestamp>lastUpdate)
      lastUpdate = obj[elem].timestamp;
  });
  return lastUpdate;
}

맨 위 코드블록 예시의 경우 metadata.desired, metadata.reported까지만 함수에 넣어주면 그 하위 키값을 순회하며 timestamp에 순차적으로 접근, 가장 큰 값을 찾아서 반환하는 함수이다.

눈여겨볼만한 부분은 if문 및 대입문에 elem이 아닌 obj[elem]을 사용했다는 점이다.

map을 활용하여 인자를 뽑아내면 String 형태이기 때문에 Object를 직접 활용한 부분이다.

 

분명 더 나은 해결 방법이 있을 것 같으니 피드백 달아주시면 감사히 배우겠습니다. :)