js:求一个数据处理方法?

const tableList = [
    "account.t_account",
    "account.t_account_ext",
    "account.t_sub_account",
   "account.t_sub_account_.*",
    "account.account.t_sub_account",
     "t_sub_accountok"
]

const databaseList = [
    "account"
]

js:求一个数据处理方法,例如上述例子, tableList处理之后,可以得到

[
    "t_account",
    "t_account_ext",
    "t_sub_account",
"t_sub_account_.*"
    "t_sub_account",
  "t_sub_accountok"
]

之前有如下方案

function format() {
  const formattedTableList = [];
  for (let i = 0; i < tableList.length; i++) {
    const tableName = tableList[i].split('.');
    formattedTableList.push(tableName);
  }
  return formattedTableList.filter((item) => item !== '.');
}

但是不能兼容account.t_sub_account_.*的场景,哪位大佬可以帮忙完善下吗?

阅读 2.9k
7 个回答

这不需要正则表达式吧,直接用 replace都行

// 处理tableList函数
function processTableList(tableList, databaseList) {
  const result = [];

  for (const table in tableList) {
    for (const database in databaseList) {
      // 判断table字符串是否以database开头,如果是,则进行拆分
      if (table.startsWith(database + '.')) {
        result.push(table.split(`${database}.`)[1]);
      }
    }

    // 判断table字符串是否包含'.'字符,并且不在result数组中,如果是,则直接添加到result数组中
    if (table.includes('.') && !result.includes(table)) {
      result.push(table);
    }
  }
  return result;
}

测试
const processedTableList = processTableList(tableList, databaseList);
console.log(processedTableList);

const tableList = [
  "account.t_account",
  "account.t_account_ext",
  "account.t_sub_account",
  "account.t_sub_account_.*",
  "account.account.t_sub_account",
  "t_sub_accountok",
];

const databaseList = ["account"];

tableList.map((item) => {
  databaseList.forEach((key) => {
    item = item.replace(new RegExp(`${key}\\.`,'g'), "");
  });
  return item;
});

你是要去除以databaseList里的字符开头的?

databaseList.map(prefix => tableList.map(str => str.replace(RegExp(`^(${prefix}\\.)+`), '')))
  tableList = tableList.map(item => {
      item = item.replace(/account[.]/g, "")
      return item
    })

思路,找 . 的位置,分割出前缀。在 databaseList 去找是否有此前缀,如果有,去掉,否则返回原来的 name

function format(tables, databases) {
    return tables.map(name => {
        const idx = name.indexOf(".");
        if (idx < 0) { return name; }
        return databases.includes(name.slice(0, idx))
            ? name.slice(idx + 1)
            : name;
    });
}

console.log(format(tableList, databaseList));

结果

[
  't_account',
  't_account_ext',
  't_sub_account',
  't_sub_account_.*',
  'account.t_sub_account',
  't_sub_accountok'
]

用正则表达式的方法也可以,只是处理 databaseList 里有多项的情况要麻烦点。

不知道是不是这种需求,根据.将databaseList拼接,如果databaseList中存在多个不同的数据,比如[a, b, c],那就是去除前面开头的多个a.b.c

let reg = new RegExp('^(' + databaseList.join('\.') + '\.)+')

//replace
tableList.map(item => item.replace(reg, ''))
//split
tableList.map(item => item.split(reg).pop())

下面是不按照databaseList中的顺序,只要元素开头往后的属性在databaseList中,就循环去除

let reg = new RegExp('^(' + databaseList.join('\|') + ')\.')

//replace
tableList.map(item => {
    while(item !== (item = item.replace(reg, ''))){}
    return item
})
//split
tableList.map(item => {
    while(item !== (item = item.split(reg).pop())){}
    return item
})
推荐问题
宣传栏