gpt4 book ai didi

javascript - 从字符串中提取泛型类型参数

转载 作者:行者123 更新时间:2023-12-02 23:56:08 25 4
gpt4 key购买 nike

我想创建一个从类型定义中提取“通用类型参数”的函数(作为纯字符串)。

它应该采用这样的输入字符串:

Foo<Bar, Baz<Qux>>

并返回一个具有引用类型+泛型的对象,如下所示(当然不必采用这种精确的格式,只要我可以检索所需的信息即可):

{
"name": "Foo",
"generics": [
{
"name": "Bar",
"generics": []
},

{
"name": "Baz",
"generics": [
{
"name": "Qux",
"generics": []
}
]
}
]
}

我的猜测是使用String.match使用像 /<.*>/g 这样的正则表达式,用逗号作为分隔符分割结果,并递归解析每个参数的泛型。但是,我觉得这太复杂了,而且我缺少一种更简单的方法。

最佳答案

最简单的方法是递归地构建一个键映射结构,然后将其转换为树。

下面的 keyMapToTree 函数使用名为 keyMapToTreeInner 的内部辅助函数。

console.log(keyMapToTree(parseAsKeyMap('Foo<Bar, Baz<Qux>>')));

function parseAsKeyMap(input, tree = {}) {
input = input.trim();
let startIndex = input.indexOf('<'),
endIndex = input.lastIndexOf('>');
if (startIndex !== -1 && endIndex === -1) {
throw new Error("Missing closing bracket '>' for " + input);
} else if (startIndex === -1 && endIndex !== -1) {
throw new Error("Missing opening bracket '<' for " + input);
} else if (startIndex !== -1 && endIndex !== -1) {
let head = input.substring(0, startIndex),
tail = input.substring(startIndex + 1, endIndex);
tree[head] = {};
tail.split(/\s*,\s*/).forEach(token => parseAsKeyMap(token, tree[head]));
} else {
tree[input] = {};
}
return tree;
}

function keyMapToTree(input) {
let keys = Object.keys(input);
if (keys.length !== 1) {
throw new Error('Object must be non-null and have only one key!');
}
let key = keys[0], node = { name: key, generics: [] };
keyMapToTreeInner(input[key], node.generics);
return node;
}

function keyMapToTreeInner(input, nodeArray) {
Object.keys(input).map(key => {
let node = { name: key, generics: [] };
keyMapToTreeInner(input[key], node.generics);
nodeArray.push(node)
});
}
.as-console-wrapper {
top: 0;
max-height: 100% !important;
}
<!--

The initial key-map will look like this, so convert this structure to a tree.

{
"Foo": {
"Bar": {},
"Baz": {
"Qux": {}
}
}
}

-->

关于javascript - 从字符串中提取泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55382732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com