Я сделал класс Enum, который может извлекать значения AND и имена в O (1). Он также может генерировать массив объектов, содержащий все Имена и Значения.
function Enum(obj) {
// Names must be unique, Values do not.
// Putting same values for different Names is risky for this implementation
this._reserved = {
_namesObj: {},
_objArr: [],
_namesArr: [],
_valuesArr: [],
_selectOptionsHTML: ""
};
for (k in obj) {
if (obj.hasOwnProperty(k)) {
this[k] = obj[k];
this._reserved._namesObj[obj[k]] = k;
}
}
}
(function () {
this.GetName = function (val) {
if (typeof this._reserved._namesObj[val] === "undefined")
return null;
return this._reserved._namesObj[val];
};
this.GetValue = function (name) {
if (typeof this[name] === "undefined")
return null;
return this[name];
};
this.GetObjArr = function () {
if (this._reserved._objArr.length == 0) {
var arr = [];
for (k in this) {
if (this.hasOwnProperty(k))
if (k != "_reserved")
arr.push({
Name: k,
Value: this[k]
});
}
this._reserved._objArr = arr;
}
return this._reserved._objArr;
};
this.GetNamesArr = function () {
if (this._reserved._namesArr.length == 0) {
var arr = [];
for (k in this) {
if (this.hasOwnProperty(k))
if (k != "_reserved")
arr.push(k);
}
this._reserved._namesArr = arr;
}
return this._reserved._namesArr;
};
this.GetValuesArr = function () {
if (this._reserved._valuesArr.length == 0) {
var arr = [];
for (k in this) {
if (this.hasOwnProperty(k))
if (k != "_reserved")
arr.push(this[k]);
}
this._reserved._valuesArr = arr;
}
return this._reserved._valuesArr;
};
this.GetSelectOptionsHTML = function () {
if (this._reserved._selectOptionsHTML.length == 0) {
var html = "";
for (k in this) {
if (this.hasOwnProperty(k))
if (k != "_reserved")
html += "<option value='" + this[k] + "'>" + k + "</option>";
}
this._reserved._selectOptionsHTML = html;
}
return this._reserved._selectOptionsHTML;
};
}).call(Enum.prototype);
Вы можете инициализировать его следующим образом:
var enum1 = new Enum({
item1: 0,
item2: 1,
item3: 2
});
Чтобы получить значение (например, Enums in C #):
var val2 = enum1.item2;
Чтобы получить имя для значения (может быть неоднозначным при установке того же значения для разных имен):
var name1 = enum1.GetName(0); // "item1"
Чтобы получить массив с каждым имя & amp; значение в объекте:
var arr = enum1.GetObjArr();
Будет генерировать:
[{ Name: "item1", Value: 0}, { ... }, ... ]
Вы также можете легко выбрать параметры выбора html:
var html = enum1.GetSelectOptionsHTML();
:
"<option value='0'>item1</option>..."
WordPress использует MyISAM из-за большей функциональности и лучшей производительности, но MyISAM не поддерживает внешние ключи. Это был компромисс.
Внешние ключи - это просто ограничения - они упрощают сохранение целостности данных, но не требуют корреляции таблиц. Wordpress использует MySQL и MySQL может использовать множество «движков» для хранения таблиц, но AFAIK только один из них (InnoDB) поддерживает внешние ключи. Wordpress, вероятно, решил не использовать его по соображениям производительности.