我有一个json对象,它有项类型和id,我需要创建新对象
var data = {
"items":[
{"type":"generator","id":"item_1","x":200,"y":200},
{"type":"battery","id":"item_2","x":50,"y":300},
{"type":"generator","id":"item_3","x":200,"y":280},
{"type":"battery","id":"item_4","x":100,"y":400}
]
};
我需要为项目中的每个项目运行
jQuery.each(data.items, function(index,value) {
eval("var " + value.id + " = new " + value.type + "(" + (index + 1) + ");");
eval(value.id + ".id = '" + value.id + "';");
eval(value.id + ".draw(" + value.x + "," + value.y + ");")
});
这不是一个好习惯,但我还能做些什么呢?
我需要对项目进行控制
类似
item_1.moveto(300,700);
但我总是得到item_1是不明白的
答案 0 :(得分:2)
var objects = {};
objects[value.id] = new window[value.type](index + 1);
答案 1 :(得分:2)
您可以创建一个工厂方法,该方法允许从抽象数据结构中生成具体类型:
var createItem = (function () {
var types = {};
function createItem(index, data) {
data = data || {};
var ctor = types[data.type], item;
if (!ctor) throw new Error("'" + data.type + "' is not a registered item type.");
item = new ctor(index);
item.id = data.id;
return item;
}
createItem.registerType = function (type, ctor) {
types[type] = ctor;
};
return createItem;
})();
然后将项目类型注册到工厂:
function Generator(index) {/*...*/}
createItem.registerType('generator', Generator);
最后创建一个对象图来按ID查找你的项目(你可以使用像ItemsMap这样的专用对象而不是普通对象),遍历你的项目并将它们添加到地图中。
var itemsMap = {};
data.items.forEach(function (itemData, i) {
var item = itemsMap[itemData.id] = createItem(i + 1, itemData);
//you can also draw them at this point
item.draw(itemData.x, itemData.y);
});
您现在可以通过ID查找对象:
var item1 = itemsMap['item_1'];