ふんばりフロントエンジニアのブログ

新米フロントエンジニアの備忘録です。ふんばり温泉タオル欲しい...

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使うときはこれでいいかも

参考:
Dynamo db json re mapper · GitHub