2017/05/31

[JavaScript]オブジェクトの無効なプロパティをすべて削除する

とあるツールにJSONを渡すとき、極力ツールのデフォルトの値を使いたかった。しかし、空文字やnull、undefinedなどのプロパティがあるとデフォルト値がうまく設定されなかった。
そのため、オブジェクトに含まれる無効なプロパティ(空文字、null、undefinedなど)など任意の条件でプロパティを削除する関数をつくった。


無効なプロパティをすべて削除する


// removeObject.js
function removeObjectBy(object, condition) {
  // lodash#cloneDeep
  const _obj = _.cloneDeep(object);
  
  const _cond = typeof condition === 'function' ? condition : function () {};

  function _remove (obj) {
    for (let o in obj) {
      if (_cond(obj[o])) {
        delete obj[o];
      } else if (typeof obj[o] === 'object') {
        _remove(obj[o]);
      }
    }
  }

  _remove(_obj, _cond);
  return _obj;
}

// この条件に合致するプロパティを削除する
const isEmpty = val => val === '' || val === null || val === undefined;

const actual = removeObjectBy(object, isEmpty);

ネストされたオブジェクトのすべての要素に再帰的にアクセスし、条件に合致するプロパティを削除している。isEmptyの部分を const isNumber = val => typeof val === 'number'; にすれば数値のプロパティだけを削除することもできる


すべての要素にアクセスする方法について、詳しく知りたい方は以下の記事を参照してほしい。

また、今回はディープコピーするためだけにlodashを使っている。
ES6から実装されたObject.assignはシャローコピーなので、ライブラリを使うか関数を自作する対策が必要だ。

ライブラリを使わずにディープコピーする方法は、以下の記事を参照してほしい。




以上

written by @bc_rikko

0 件のコメント :

コメントを投稿