exabugs/node-searcher

View on GitHub
lib/extend/index.js

Summary

Maintainability
A
0 mins
Test Coverage
"use strict";

var extend = {

  /**
   * 継承
   * @param object {Object}
   * @param master {Object}
   * @param attrs {Array}
   */
  extend: function (object, master, attrs) {
    if (!(attrs instanceof Array)) {
      attrs = Object.keys(master);
    }
    for (var i = 0; i < attrs.length; i++) {
      var x = attrs[i];
      this.setValue(object, x, this.getValue(master, x));
    }
  },

  /**
   * obj[key] 取得
   * @param {Object} obj アクセスされるオブジェクト
   * @param {String} key アクセスするプロパティを表す文字列
   * @param {Any} [val=undefined] プロパティが存在しなかった場合の返り値
   * @return {Any} プロパティが存在した場合はその値を、無ければ<code>val</code>の値
   */
  getValue: function (obj, key, val) {
    return this.getObject(obj, key, function (err, obj, key) {
      return err ? val : obj[key];
    }, true);
  },

  /**
   * obj[key] 設定
   * @param {Object} obj アクセスされるオブジェクト
   * @param {String} key アクセスするプロパティを表す文字列
   * @param {Any} val セットする値
   */
  setValue: function (obj, key, val) {
    return this.getObject(obj, key, function (err, obj, key) {
      return err ? false : obj[key] = val;
    }, false);
  },

  /**
   * obj[key] 確認
   * @param {Object} obj アクセスされるオブジェクト
   * @param {String} key アクセスするプロパティを表す文字列
   * @return {Boolean} プロパティが存在するかどうか?
   */
  hasValue: function (obj, key) {
    return this.getObject(obj, key, function (err, obj, key) {
      return err ? false : key in obj;
    }, true);
  },

  /**
   * obj[key] 削除
   * @param {Object} obj アクセスされるオブジェクト
   * @param {String} key アクセスするプロパティを表す文字列
   * @return {Boolean} プロパティを削除できたか?
   */
  delValue: function (obj, key) {
    return this.getObject(obj, key, function (err, obj, key) {
      return err ? false : delete obj[key];
    }, true);
  },

  /**
   * obj[key]にアクセスできるように
   * @private
   * @param obj
   * @param key
   * @param callback
   * @returns {*}
   */
  getObject: function (obj, key, callback, readonly) {
    var keys = key.split('.');
    var k = keys.pop();

    obj = keys.reduce(function (obj, key) {
      if (undefined === obj) {
        return undefined;
      }
      if (undefined === obj[key]) {
        if (readonly) {
          return undefined;
        } else {
          obj[key] = {};
        }
      }
      return obj[key];
    }, obj);

    var err = (0 < keys.length && obj === undefined);

    return callback(err, obj, k);
  }

}

module.exports = extend;