DynamoDBから取得したデータを正常にマッピングして整形する
最近AWSよく使っているのですが、データベースとしてDynamoDBを使うことが多いです。
全てJavaScriptで完結できるのでありがたい面もあるのですが、若干めんどくさいことも多いです。
その中の一つがDynamoDBの中にMapとして保存している場合です。
例としてはこんな感じですかね。
const testDDB = { key1: { 'S': 'value' }, key2: { 'S': 'value' } }
取得した際にStringなら「S」といったように余計なオブジェクトが作られてしまっています。
そのようなデータをマッピングするのがこちらの関数。
const mapper = (data) => { let S = "S"; let SS = "SS"; let NN = "NN"; let NS = "NS"; let BS = "BS"; let BB = "BB"; let N = "N"; let BOOL = "BOOL"; let NULL = "NULL"; let M = "M"; let L = "L"; const isObject = (value) => typeof value === "object" && value !== null; if (isObject(data)) { let keys = Object.keys(data); while (keys.length) { let key = keys.shift(); let types = data[key]; if (isObject(types) && types.hasOwnProperty(S)) { data[key] = types[S]; } else if (isObject(types) && types.hasOwnProperty(N)) { data[key] = parseFloat(types[N]); } else if (isObject(types) && types.hasOwnProperty(BOOL)) { data[key] = types[BOOL]; } else if (isObject(types) && types.hasOwnProperty(NULL)) { data[key] = null; } else if (isObject(types) && types.hasOwnProperty(M)) { data[key] = mapper(types[M]); } else if (isObject(types) && types.hasOwnProperty(L)) { data[key] = mapper(types[L]); } else if (isObject(types) && types.hasOwnProperty(SS)) { data[key] = types[SS]; } else if (isObject(types) && types.hasOwnProperty(NN)) { data[key] = types[NN]; } else if (isObject(types) && types.hasOwnProperty(BB)) { data[key] = types[BB]; } else if (isObject(types) && types.hasOwnProperty(NS)) { data[key] = types[NS]; } else if (isObject(types) && types.hasOwnProperty(BS)) { data[key] = types[BS]; } } } return data; }
これを実行すると..
console.log(mapper(testDDB)) // Object {key1: "value",key2: "value"}
きれいに一次元になりました。
DynamoDB使うときはこれでいいかも