javascript - 使用 javascript 使用正则表达式映射对象键

标签 javascript arrays object

对象数组包含一个键“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/

相关文章:

javascript - 按值求和不同长度的对象数组

javascript - 无法通过解析获取 query.containedIn 查询中的 objectId?

javascript - 在javascript中根据对象值声明变量

javascript - 将对象数组添加到现有对象

javascript - Spotify 隐式授权流程 - 缺少必需参数 : client_id

javascript - 将一个数分解为 100 的因数并保留余数

javascript - 如何使用 momentjs 将澳大利亚/墨尔本时区设置为倒计时器

arrays - swift/电视操作系统 : Complex Arrays with multiple strings?

object - OCaml 对象的多态类型问题

javascript - 使用带有 innerHTML 的 if 语句来替换内容,我的方法不起作用......完全