如何从这种String中获取关键字
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从这种String中获取关键字相关的知识,希望对你有一定的参考价值。
我需要从这种字符串中获取“付款类型和客户类型”
Examples:
| D | A | B | C |
| NZ | AAA | BBB | NZ |
| AZ | CCC | DDD | AZ |
| CA | EEE | FFF | CA |
我应该尝试获取模式并为此编写函数吗?或者我可以找到一些库来检测它
所以输出应该是{payment:[“AAA”,“CCC”,“EEE”],客户:[“BBB”,“DDD”,“FFF”]}
function detect(str){
let countBar=1
let countBar2=0
let paymentLoc=NaN
let customerLoc=NaN
let after =0
let arr1=str.split(" ")
arr1=arr1.filter(item=>{return item!==""})
let newStr=''
for(let i=0;i<arr1.length;i++){
arr1[i].trim()
if(arr1[i]==='|'){
countBar++
}
if(arr1[i]==="||"){
countBar2++
}
if(arr1[i].includes("payment")){
paymentLoc=i
}
after=((countBar/(countBar2))-1)*2
let sol=[]
for(let i=0;i<arr1.length;i++){
if(arr1[i].includes("payment")){
console.log('payment index',i)
sol.push(arr1[i+after+1])
}
if(arr1[i].includes("customer")){
console.log('customer index',i)
sol.push(arr1[i+after+1])
}
}
newStr=arr1.join('')
console.log(newStr)
}
答案
我对这个玩得很开心。我的第一个想法是使用npm包,因为字符串看起来很像CSV,|
作为分隔符。包csvtojson是一个很好的,但为什么当你可以一起破解时使用一个备受推崇的库?
这是我的第一次尝试(在Typescript中):
const exampleString = ` | market | payment type | customer type | translation |
| NZ | AAA | BBB | NZ |
| AZ | CCC | DDD | AZ |
| CA | EEE | FFF | CA |`;
const cleanColumn = (col: string) =>
col
.replace("|", "")
.trim()
.replace(/s/, "_");
const cleanRow = (row: string) =>
row
.split(/s|/)
.map(cleanColumn)
.filter(Boolean);
const pivotRows = (
pivoted: string[][],
currentRow: string[],
rowIndex: number
) => {
if (rowIndex === 0) {
currentRow.forEach((col, colIndex) => {
pivoted[colIndex] = [col];
});
} else {
currentRow.forEach((col, colIndex) => {
pivoted[colIndex].push(col);
});
}
return pivoted;
};
const buildObject = (
obj: { [key: string]: string[] },
currentRow: string[]
) => {
let currentCol: string;
currentRow.forEach((col, index) => {
if (index === 0) {
currentCol = col;
obj[currentCol] = [];
} else {
obj[currentCol].push(col);
}
});
return obj;
};
const detect = (str: string) =>
str
.split("
")
.map(cleanRow)
.reduce(pivotRows, [])
.reduce(buildObject, {});
console.log(detect(exampleString));
如果你看看detect
,它只是在字符串上执行一系列函数。第一个只是通过换行符拆分它。我喜欢你用countBar
变量的目的,但这似乎更容易。
这给了我们一堆字符串数组,需要分解成列。在这里,我使用了一些RegEx来分隔space
和|
组合之间的所有内容。在cleanColumn()
中,我删除剩余的|
s,以防有任何落后者,然后用下划线替换空格,以便它们可以用作对象键。
然后,用.filter(Boolean)
技巧(link)删除空字符串。最后两个函数可能比必要的更冗长,但它们完成了这项工作。 pivotRows()
使用行索引和列索引将列转换为行。最后,在buildObject()
中,每个行的第一个元素被添加为对象的键,其余的值被推送到字符串数组中。
真的,你应该只使用csvtojson
。
另一答案
这是一个只是通过|分裂的尝试。
var text = `| market | payment type | customer type | translation |
| NZ | AAA | BBB | NZ |
| AZ | CCC | DDD | AZ |
| CA | EEE | FFF | CA |`;
var result = {
payment: text.split('|').filter((f, i) => i-7 >= 0 && (i - 7) % 5 == 0)
.map(p => p.trim()),
customer: text.split('|').filter((f, i) => i-8 >= 0 && (i - 8) % 5 == 0)
.map(p => p.trim())
}
console.log(result)
以上是关于如何从这种String中获取关键字的主要内容,如果未能解决你的问题,请参考以下文章