Javascript 动态选择要从中创建对象的类
我目前正在尝试基于从ajax调用获得的json创建一个对象。看起来是这样的:Javascript 动态选择要从中创建对象的类,javascript,typescript,Javascript,Typescript,我目前正在尝试基于从ajax调用获得的json创建一个对象。看起来是这样的: { "users": [ { "address": { "city": "testCity", "houseNumber": 69, "id": 1, "postcode": 420, "street":
{
"users": [
{
"address": {
"city": "testCity",
"houseNumber": 69,
"id": 1,
"postcode": 420,
"street": "testStreet"
},
"email": "testEmail@test.de",
"gender": "male",
"id": 3,
"isAdmin": false,
"lastname": "testLastname",
"prename": "testPrename",
"projects": [
{
"archived": null,
"files": [],
"id": 1,
"name": "testProject",
"timestamp": "2017-01-27T20:23:06+00:00",
"uri": "http://localhost:2000/api/projects/1"
}
],
"uri": "http://localhost:2000/api/users/3"
}
]
}
我在User类中定义了一个静态方法,用于根据该输入创建User类型的对象。我要寻找的是一种创建Project和Address类对象的方法,并将它们设置为User类中相应的字段。这就是我目前拥有的:
export class User {
public uri: string = undefined;
public id: number = undefined;
public readonly isAdmin: boolean = undefined;
public prename: string = undefined;
public lastname: string = undefined;
public gender: string = undefined;
public email: string = undefined;
private password: string = undefined;
public address: Address = undefined;
public projects: Project[] = undefined;
constructor() {
}
// Returns an array containing one or more User objects
public static load(res: Response): User[]{
let data: Object = res.json();
let users: User[] = [];
// Payload contains multiple Users (array)
if(data.hasOwnProperty('users')){
let dataUsers: Object[] = data['users'];
for(let dataUser of dataUsers){
let user = new User();
for(let key in user){
if(dataUser.hasOwnProperty(key)){
if(typeof dataUser[key] === 'object'){
// If it's an object, find the class that matches the 'content' of the object and call their load method
}
} else {
user[key] = dataUser[key];
}
}
}
users.push(user);
}
// Payload contains a single User
} else if(data.hasOwnProperty('user')){
let dataUser = data['user'];
let user = new User();
for(let key in user){
if(data.hasOwnProperty(key)){
user[key] = dataUser[key];
}
}
users.push(user);
} else {
users.push(new User());
}
return users;
}
一种方法是通过检查键是“Projects”还是“Address”来硬编码Address和Projects的对象创建,但我正在寻找一种更“动态”的方法来点它。您可以将加载函数存储在地图中。它看起来像这样
class Address {
static load(data:Object) {
//...
}
}
class Project {
static load(data:Object) {
}
}
let keyClassMap : { [id:string]: (data:Object) => any } = {
address: Address.load,
project: Project.load,
}
此对象的键是与您感兴趣的类定义相对应的键
然后在你的声明中,你可以做:
if(typeof dataUser[key] === 'object'){
user[key] = keyClassMap[key](dataUser[key]);
}
谢谢你的回答!上述加载功能在所有模型(用户、地址、项目…)上实现。因此,我不是通过调用构造函数来创建对象,而是通过调用相应类的静态加载函数(如果我必须创建多个实例)来创建对象。这会导致一个类型错误:keyClassMap[key]不是一个函数