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."
idxes.reduce (a,b,ci,ar)->
a[b] = ar.length-1 is ci and v or a[b] or {}
, obj
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 를 비교하는 부분이 좀 마음에 안드는데 아이디어가 없네.
댓글
댓글 쓰기