Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按名称动态实例化对象_Javascript_Node.js_Typescript - Fatal编程技术网

Javascript 按名称动态实例化对象

Javascript 按名称动态实例化对象,javascript,node.js,typescript,Javascript,Node.js,Typescript,我必须解析非结构化的日志文件。这些日志文件有多条不同的消息。不过,每条消息都有一个特定的结构。例如: TIMESTAMP:MESSAGE_NAME1:PARAM1:PARAM2:PARAM3 TIMESTAMP:MESSAGE_NAME2:PARAM1:PARAM2:PARAM3:PARAM4:PARAM5 let name: string = splitArray[0]; 正如您所看到的,这些消息是结构化的,但可以有不同的参数和不同数量的参数。我有超过90条不同的消息,其中一些甚至有参数,

我必须解析非结构化的日志文件。这些日志文件有多条不同的消息。不过,每条消息都有一个特定的结构。例如:

TIMESTAMP:MESSAGE_NAME1:PARAM1:PARAM2:PARAM3
TIMESTAMP:MESSAGE_NAME2:PARAM1:PARAM2:PARAM3:PARAM4:PARAM5
let name: string = splitArray[0];
正如您所看到的,这些消息是结构化的,但可以有不同的参数和不同数量的参数。我有超过90条不同的消息,其中一些甚至有参数,可以出现多次,因此可能是数组

我想要实现的是为每一条消息都建立一个类。为此,我已经可以提取消息名称。但是,我不知道如何根据消息名实例化对象,而不使用非常长的switch语句,这对我来说似乎是糟糕的编码

因此,我希望能够做的是,例如:

getInstanceByClassName(className: string, params: any[]) {
    //magic code
    return instance;
}
export class Message1 {
    param1: string;
    param2: string;
    param3: string;
    param4: string;
    param5: string;
    param6: string;
}

if (name === "Message1") {
    let message: Message1 = new Message1(splitArray[1], splitArray[2], ...);
} else if (name === "Message2") ...
我尝试创建这样的函数,方法如下所示:

但是,如果没有
new
关键字,我将无法实例化错误。 我正在使用打字脚本

编辑:

我的课程是这样的:

getInstanceByClassName(className: string, params: any[]) {
    //magic code
    return instance;
}
export class Message1 {
    param1: string;
    param2: string;
    param3: string;
    param4: string;
    param5: string;
    param6: string;
}

if (name === "Message1") {
    let message: Message1 = new Message1(splitArray[1], splitArray[2], ...);
} else if (name === "Message2") ...
我解析日志并获取消息名称,例如:

TIMESTAMP:MESSAGE_NAME1:PARAM1:PARAM2:PARAM3
TIMESTAMP:MESSAGE_NAME2:PARAM1:PARAM2:PARAM3:PARAM4:PARAM5
let name: string = splitArray[0];
现在我想实例化我当前要执行的类,如下所示:

getInstanceByClassName(className: string, params: any[]) {
    //magic code
    return instance;
}
export class Message1 {
    param1: string;
    param2: string;
    param3: string;
    param4: string;
    param5: string;
    param6: string;
}

if (name === "Message1") {
    let message: Message1 = new Message1(splitArray[1], splitArray[2], ...);
} else if (name === "Message2") ...
(或带有开关箱……)

显然,这将导致大量的国际单项体育联合会成员国或交换案件

还有别的办法吗?特别是考虑到每个构造函数可以有不同数量的参数


如果您需要更多信息,请告诉我,以便我提供。

在我看来,似乎可以使用单个类

class Message {
   public messageName: string;
   public time: string;
   public params: string[];
   constructor(logMessage: string) {
       const parts = logMessage.split(":");
       // TODO: Make it a date
       this.time = parts.shift();
       this.messageName = parts.shift();
       this.params = parts;
   }
}
如果您实际上有单独的
Message1/2/3/4
类,则情况不同,因此您需要字符串和构造函数之间的一些映射,以便能够正确地实例化它们


我们需要看看这些类是什么样子的,因为您需要进入泛型以保持类型安全,从您的示例代码来看,这些类看起来几乎是复制粘贴的

您应该准确地显示您在问题中尝试了什么。我们通常不会为您编写神奇的代码,我们会帮助您修复现有的代码。还不清楚您希望如何使此类型安全,因为您正在传入一个字符串名,我猜这是构造函数的名称name@JuanMendes我添加了一些代码。我不指望你的魔法密码。我想知道是否有更好的方法,以及如何做到这一点。当然,我会亲自尝试实施。但是我需要一个概念来做到这一点。如果每个对象都是它自己的类,那么对象的
又有什么意义呢?在javascript中,在这种情况下,您也可以将其设置为对象(typescript可能是
Any
),简单的方法是将名称绑定到
map
{name1:Message1,name2:Message2}
,然后通过spread操作符实例化消息:
新映射[name](…splitArray)
(在这里,您必须事先删除
splitArray
的第一个元素。显然,您可能认为可以使用单个类是正确的。我将对此进行检查。参数的唯一问题是,它们将具有不同的名称,我可能必须映射到数据库表。因此,我认为为每个混乱命名参数可能更容易年龄(班级)。但是,也许我可以循环遍历参数,因为它们在每条消息中应该始终具有相同的序列。如果参数需要完全独立的工作来构造,我不知道如何使用泛型函数来构造不相关的类。如果您有一个实际代码的示例,我可能会建议使用更多类型的safe,但如果没有一个实际的例子,很难判断。