Source: haluappspec.mixin-1.0.0.js

(function ($, $H) {

  // 名前空間を設定する
  let App = $H.Library;

  /**
   * 関数を追加する
   * @mixin AppSpecMixin
   */
  App.AppSpecMixin = {

    /**
     * 値の型を取得する(typeof の代替メソッド)
     * @memberof AppSpecMixin
     * @param {object} value - チェック対象
     * @returns 値の型
     */
    typeOf: function (value) {
      //変数宣言
      let result = null;

      result = Object.prototype.toString.call(value);

      const LTSH_NULL_OR_UNDEFINED = {
        '[object Object]': 'IE',
        '[object Window]': 'Opera',
        '[object DOMWindow]': 'Safari iOS',
        '[object global]': 'Android'
      };
      if (!value) {
        if (result in LTSH_NULL_OR_UNDEFINED) {
          result = (value === null ? 'Null' : 'Undefined');
        }
      }
      if (result === 'Object') {
        if (value.constructor !== Object) {
          return (null);
        }
      }
      return (result.toLowerCase().replace(/^\[.+ (.+)\]$/, "$1"));
    },

    /**
     * 値の有無チェック
     * @memberof AppSpecMixin
     * @param {object} value - チェック対象
     * @return 判定結果(true:値あり/false:nullまたはundefined)
     */
    isExists: function (value) {
      return (value != null && value != undefined);
    },

    /**
     * 値の型チェック(数値)<br>
     * チェック対象が数値型かどうかチェックする
     * @memberof AppSpecMixin
     * @param {object} value - チェック対象
     * @param {object} strict - 判定基準(true:数値型のみ/false:数字のみの文字列型も許可)
     * @returns 判定結果(true:OK/false:NG)
     * <br><hr>
     */
    isNumeric: function (value, strict) {
      //変数宣言
      let type = null;

      //判断基準を取得:引数の値が未設定の場合はtrueを設定
      strict = App.AppSpecMixin.replaceIfUndefined(strict, true) == true;
      //チェック対象の型を取得
      type = typeof (value);
      //数値型 または 数字のみの文字列型 かどうか、判定結果を返す
      return (
        (type == 'number' || (!strict && type == 'string' && value != '')) &&
        !isNaN(value) &&
        isFinite(value));
    },

    /**
     * 値の型チェック(配列)
     * チェック対象が配列かどうかチェックする
     * @memberof AppSpecMixin
     * @param {object} obj - チェック対象
     * @returns 判定結果(true:配列/false:非配列)
     */
    isArrayObj: function (obj) {
      //配列かどうか、判定結果を返す
      return (obj.constructor === Array);
    },

    /**
     * チェック対象がnull または undefined の場合、代替値をセットして返す
     * @memberof AppSpecMixin
     * @param {object} value - チェック対象
     * @param {object} replace - 代替値
     * @returns 判定後の値
     */
    replaceIfNotExists: function (value, replace) {
      //代替値がundefinedの場合はnullを設定
      replace = replace != undefined ? replace : null;
      //チェック対象がnull または undefined の場合、代替値をセットして返す
      return (App.AppSpecMixin.isExists(value) ? value : replace);
    },

    /**
     * チェック対象が undefined の場合、代替値をセットして返す
     * @memberof AppSpecMixin
     * @param {object} value - チェック対象
     * @param {object} replace - 代替値
     * @returns 判定後の値
     */
    replaceIfUndefined: function (value, replace) {
      //チェック対象がundefinedの場合はnullを設定
      replace = replace != undefined ? replace : null;
      //チェック対象が undefined の場合、代替値をセットして返す
      //undefined出ない場合は元の値をそのまま返す
      return (value != undefined ? value : replace);
    },

    /** 
     * チェック対象が数値ではない場合、代替値をセットして返す
     * @memberof AppSpecMixin
     * @param { object } value - チェック対象
     * @param { object } replace - 代替値
     * @param { boolean } strict - 判定基準(true:数値型のみ/false:数字のみの文字列も許可)
     * @returns (数値の場合:value/それ以外の場合:replace)
    */
    replaceIfNotNumeric: function (value, replace, strict) {
      let temp =
        replace == null ? replace : App.AppSpecMixin.replaceIfUndefined(replace, 0);
      return (App.AppSpecMixin.isNumeric(value, strict) ? value : temp);
    },

    /**
     * 指定オブジェクトから、キーの配列を生成する
     * @memberof AppSpecMixin
     * @param { object } obj - オブジェクト
     * @returns キー配列
     */
    getArrayOfKey: function (obj) {
      let result = false;
      let key = null;

      switch (App.AppSpecMixin.typeOf(obj)) {
        case 'object':
          result = [];
          for (key in obj) {
            result.push(key);
          }
          break;
        case 'array':
          result = [];
          for (let i = 0, n = obj.length; i < n; i++) {
            result.push(i);
          }
          break;
      }
      return (result);
    },

    /**
     * 指定オブジェクトから、値の配列を生成する
     * @memberof AppSpecMixin
     * @param { object } obj - オブジェクト
     * @returns 値の配列
     */
    getArrayOfValue: function (obj) {
      let result = false;

      switch (App.AppSpecMixin.typeOf(obj)) {
        case 'object':
          result = [];
          for (key in obj) {
            result.push(obj[key]);
          }
          break;
        case 'array':
          result = [];
          for (let i = 0, n = obj.length; i < n; i++) {
            result.push(obj[i]);
          }
          break;
      }
      return (result);
    },

    /**
     * JSONオブジェクトに含まれる配列(sqls, records など)から、<br>
     * 指定idに対応する要素を求めて返す<br>
     * <br>
     * ここで扱うJSONオブジェクトには、次の構造が含まれることを想定しています<br>
     * jsonObj[index]["id"]  (index:0~)
     * @memberof AppSpecMixin
     * @param { object } jsonObj - 検索対象のJSONオブジェクト
     * @param { object }  id - 検索ID
     * @returns 検索結果(該当なし または jsonObj が配列ではない場合:false)
     *
     */
    getJSONChunkById: function (jsonObj, id) {
      //変数定義
      let result = false; // 戻り値
      let index = 0;
      let temp = null;

      // jsonObj が配列の場合のみ検索を実施
      if (jsonObj.constructor === Array) {
        for (index in jsonObj) {
          //変数初期化
          remp = null;
          //配列を取得
          temp = jsonObj[index];
          // id が合致していたら、現在の要素を戻り値とする
          if (temp["id"] === id) {
            result = temp;
            break;
          }
        }
      }
      return (result);
    },

    /**
     *  JSONオブジェクトid検索(ラッパー関数)
     * JSONオブジェクトに含まれる「sqls 部分」から、
     * 指定idに対応する要素を求めて返却します
     *
     * ここで扱うJSONオブジェクトには、次の構造が含まれることを想定しています
     * jsonObj["sqls"][index]["id"]  (index:0~)
     * @memberof AppSpecMixin
     * @param {object} jsonObj - 検索対象のJSONオブジェクト
     * @param {object} id - 検索ID
     * @returns 検索結果(該当なし または jsonObj["sqls"] なしの場合:false)
     */
    getJSONChunkByIdAtSqls: function (jsonObj, id) {
      return (this.getJSONChunkById(jsonObj["sqls"], id));
    },

    /** 
     * JSONオブジェクトid検索(ラッパー関数)<br>
     * JSONオブジェクトに含まれる「records 部分」から、
     * 指定idに対応する要素を求めて返却します
     *
     * ここで扱うJSONオブジェクトには、次の構造が含まれることを想定しています
     * jsonObj["records"][index]["id"]  (index:0~)
     * @memberof AppSpecMixin
     * @param {object} jsonObj - 検索対象のJSONオブジェクト
     * @param {object} id - 検索ID
     * @returns 検索結果(該当なし または jsonObj["records"] なしの場合:false)
    */
    getJSONChunkByIdAtRecords: function (jsonObj, id) {
      return (this.getJSONChunkById(jsonObj["records"], id));
    },
  
    /** 
     * 配列インデックス指定を正規表現に変換する
     * 数値・正規表現文字列・正規表現を受け付けます
     * @memberof AppSpecMixin
     * @param {object} index - 配列インデックス(def:'.*')
     * @returns 変換された正規表現
     */
    convertIndexToRegExp: function (index) {
      let result = App.AppSpecMixin.replaceIfNotExists(index, '.*');
      switch (App.AppSpecMixin.typeOf(result)) {
        case 'regexp':
          break;
        case 'number':
          result = new RegExp('^' + result.toString() + '$');
          break;
        case 'string':
          if (App.AppSpecMixin.isNumeric(result, false)) {
            result = new RegExp('^' + result + '$');
          } else {
            result = new RegExp(result);
          }
          break;
        default:
          result = new RegExp('.*');
          break;
      }
      return (result);
    }
  };

}(jQuery, Halu));