对象数组包含一个键“dataTypes”,其中包含从后端获取的多种数据类型。所有这些数据类型应分为四个部分 number、string、date、boolean
。由于有很多数据类型,我正在考虑使用键进行对象映射允许 regexp 。
const data = [
{
"title": "id",
"dataTypes": "character varying(65535)"
},
{
"title": "value",
"dataTypes": "int"
},
{
"title": "number_value",
"dataTypes": "bigint"
},
{
"title": "first_name",
"dataTypes": "varchar"
},
{
"title": "last_name",
"dataTypes": "char"
},
{
"title": "activated_date",
"dataTypes": "date without timestamp"
},
{
"title": "selected",
"dataTypes": "boolean"
},
]
const objectMap = {
"char" : "string",
"varchar" : "string",
"character varying(65535)" : "string",
"int" : "number",
"numeric" : "number",
"bigint" : "number",
"boolean" : "boolean",
"date" : "date",
"date without timestamp" : "date"
};
data.map(el => el.dataTypes = objectMap[el.dataTypes])
console.log(data)
因为我需要在对象中添加更多键,所以我是否可以使用正则表达式作为键
const objectMap = {
.*char.* : "string"
}
预期结果:
const data = [
{
"title": "id",
"dataTypes": "string"
},
{
"title": "value",
"dataTypes": "int"
},
{
"title": "number_value",
"dataTypes": "int"
},
{
"title": "first_name",
"dataTypes": "string"
},
{
"title": "last_name",
"dataTypes": "string"
},
{
"title": "activated_date",
"dataTypes": "date"
},
{
"title": "selected",
"dataTypes": "boolean"
},
]
最佳答案
您可以使用另一个包含所有可能的替换值和匹配条件的数组 - 它可以是字符串或正则表达式(或函数或...)
const data = [
{ "title": "id", "dataTypes": "character varying(65535)" },
{ "title": "value", "dataTypes": "int" },
{ "title": "number_value", "dataTypes": "bigint" },
{ "title": "first_name", "dataTypes": "varchar" },
{ "title": "last_name", "dataTypes": "char" },
{ "title": "activated_date", "dataTypes": "date without timestamp" },
{ "title": "selected", "dataTypes": "boolean" },
];
const replacements = [
{ criteria: /.*char.*/, replacement: "string" },
{ criteria: "int", replacement: "number" },
{ criteria: "numeric", replacement: "number" },
{ criteria: "bigint", replacement: "number" },
{ criteria: "boolean", replacement: "boolean" },
{ criteria: /date.*/, replacement: "date" }
];
data.forEach(d => {
const needle = replacements.find(r => {
if (typeof r.criteria === "string") {
return d.dataTypes === r.criteria;
} else {
return r.criteria.test(d.dataTypes);
}
});
d.oldDataTypes = d.dataTypes; // only for easier validation in the console
d.dataTypes = needle ? needle.replacement : d.dataTypes;
})
console.log(data);
关于javascript - 使用 javascript 使用正则表达式映射对象键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57824223/