angular - 打字稿:我怎样才能简单地将数组数组转换为类型的对象
问题描述
我正在Angular 6中开发。我想知道是否有一种简单的方法来处理一堆模型,这些模型描述了一堆相应数组中结构化值集的格式。我正在寻找一种简单的千篇一律的方法,而不是自定义创建代码来使用 For 循环将每个数组的每个单独元素引入模型实例。一些模型更复杂,并且会有多个嵌套级别。
一个简单的案例:
模型:
export class User {
firstName = '';
lastName = '';
userName = '';
email = '';
}
大批:
[
["Adam","Richardson","AdMan","Adam@example.com"],
["Ahmad","Ali","MarketMan","Ahmad@example.com"],
["Feng","Trunk","SuperMan","Feng@example.com"],
["Chris","Garcia","SmartMan","Donald@example.com"]
]
有什么方法可以神奇地将模型叠加到仅值数组上吗?
解决方案
如果您想要一种用值数组中的数据填充任何对象的通用方法,您可以执行以下操作(只要您在类中声明属性的顺序与数据进入数组的顺序相同):
class User {
firstName = '';
lastName = '';
userName = '';
email = '';
}
const data = [
["Adam", "Richardson", "AdMan", "Adam@example.com"],
["Ahmad", "Ali", "MarketMan", "Ahmad@example.com"],
["Feng", "Trunk", "SuperMan", "Feng@example.com"],
["Chris", "Garcia", "SmartMan", "Donald@example.com"]
];
function fromDataArray<T>(klass: new () => T, data: any[]) {
const obj = new klass();
Object.keys(obj).forEach((k, i) => obj[k] = data[i]);
return obj;
}
const users = data.map(d => fromDataArray(User, d));
创建适用于嵌套对象的泛型方法时遇到的问题之一是,一旦将 TypeScript 转换为 JavaScript,所有类型都会丢失。消除该问题的唯一方法是在您的类中使用初始对象来实例化应该是具有该类型实例的对象的属性。
这是一个使用此类数据数组的嵌套对象的示例,向您展示它可以完成:
function fromDataArray<T>(klass: new () => T, data: any[]) {
const obj = new klass();
Object.keys(obj).forEach((k, i) => {
if (Array.isArray(obj[k])) {
if (obj[k].length && typeof obj[k][0] === "object") {
obj[k] = data[i].map(d => fromDataArray(obj[k][0].constructor, d));
}
else {
obj[k] = data[i];
}
}
else if (typeof obj[k] === "object") {
obj[k] = fromDataArray(obj[k].constructor, data[i])
}
else {
obj[k] = data[i];
}
});
return obj;
}
class SubClass3 {
email = '';
}
class SubClass2 {
userName = '';
stuffz = [new SubClass3()];
}
class SubClass1 {
lastName = '';
subClass2 = new SubClass2();
}
class Class1 {
firstName = '';
subClass1 = new SubClass1();
}
const data = [
["Adam", ["Richardson", ["AdMan", [ [ "Adam@example.com"] ]]]],
["Ahmad", ["Ali", ["MarketMan", [ [ "Ahmad@example.com"] ]]]],
["Feng", ["Trunk", ["SuperMan", [ [ "Feng@example.com"] ]]]],
["Chris", ["Garcia", ["SmartMan", [ [ "Donald@example.com"] ]]]]
];
const crazyData = data.map(d => fromDataArray(Class1, d));
这将给出一个如下所示的对象数组。
请注意,这是 JSON 表示,但它们是适当类型的对象。
{
"firstName": "Adam",
"subClass1": {
"lastName": "Richardson",
"subClass2": {
"userName": "AdMan",
"stuffz": [
{
"email": "Adam@example.com"
}
]
}
}
}