GASとかちょっとしたJavaScript使う時にいつの間にかちょっとだけEnum使いたい時のメモ
enum.js
/**
* Enumの実装クラス
*/
Enum = function() {
this._enums = [];
this._lookups = {};
};
/**
* enumを取得する
* @return {array} enumオブジェクト
*/
Enum.prototype.getEnums = function() {
return _enums;
};
/**
* 繰り返し処理する
* @param {array} callback コールバック
*/
Enum.prototype.forEach = function(callback){
var length = this._enums.length;
for (var i = 0; i < length; ++i){
callback(this._enums[i]);
}
};
/**
* enumを追加する
* @param {object} e enumの追加情報
*/
Enum.prototype.addEnum = function(e) {
this._enums.push(e);
};
/**
* 名前を取得する
* @param {string} name 名前
* @return {string} 名前文字列
*/
Enum.prototype.getByName = function(name) {
return this[name];
};
/**
* 値を取得する
* @param {string} field フィールド
* @param {object} value 値
* @return {object} 設定した値
*/
Enum.prototype.getByValue = function(field, value) {
var lookup = this._lookups[field];
if(lookup) {
return lookup[value];
} else {
this._lookups[field] = ( lookup = {});
var k = this._enums.length - 1;
for(; k >= 0; --k) {
var m = this._enums[k];
var j = m[field];
lookup[j] = m;
if(j == value) {
return m;
}
}
}
return null;
};
/**
* Enumを定義する
* @param {object} definition 定義内容
* @return {object} enum
*/
function defineEnum(definition) {
var k;
var e = new Enum();
for(k in definition) {
var j = definition[k];
e[k] = j;
e.addEnum(j);
}
return e;
}
使い方
main.js
// 定義
var COLORS = defineEnum({
RED : {
value : 1,
string : 'red'
},
GREEN : {
value : 2,
string : 'green'
},
BLUE : {
value : 3,
string : 'blue'
}
});
// 文字列を取得
COLORS.BLUE.string;
// 値を取得
COLORS.BLUE.value;
// 名前を元に文字列を取得
COLORS.getByName('BLUE').string;
// 値を元に文字列を取得
COLORS.getByValue('value', 1).string;
// enumの定義されている値一覧を処理する
COLORS.forEach(function(e){
});
参考URL