2016년 7월 6일 수요일

오늘의 코드 - Excel 에서 Collection 까지 (feat. dot2obj)

Meteor.startup ->
  if Tours.find().count() is 0
    addDefault = (v)->
      v.createdAt = Date.now()
      v
    dot2obj = (obj)->
      for k,v of obj
        idxes = k.split '.'
        if idxes.length>0
          delete obj[k]
          idxes.reduce (a,b,ci,ar)->
            a[b] = ar.length-1 is ci and v or a[b] or {}
          , obj
      obj
    excel = new Excel 'xlsx'
    workbook = excel.read new Buffer Assets.getBinary "fixtures.xlsx"
    fixtures = excel.utils.sheet_to_json workbook.Sheets['Sheet1']

    Tours.insert addDefault dot2obj obj for obj in fixtures
    console.log "Tours collection initiated."

이런 코드를 만들었다.
Tours 라는 collection이 비어있으면
excel 파일을 읽어서 (netanelgilad:excel 패키지 사용) 넣는데 헤더 이름이 a.b.c 처럼 dot notation 을 포함하고 있으면 알아서 { a: {b: {c: "value"}}} 로 집어넣도록 변환하는 것까지.

reduce로 초기 object를 넣어서 마지막 depth에 닿으면 값을 할당하고 아닐 경우 해당 인덱스가 없으면 만들면서 계속 진행하는 방식으로 만들었다.

          idxes.reduce (a,b,ci,ar)->
            a[b] = ar.length-1 is ci and v or a[b] or {}
          , obj

바로 이 부분

ar.length-1 이랑 ci 를 비교하는 부분이 좀 마음에 안드는데 아이디어가 없네.