gpt4 book ai didi

javascript - 如何通过正则表达式模式匹配对字符串数组中的元素进行排序

转载 作者:行者123 更新时间:2023-12-02 21:15:06 25 4
gpt4 key购买 nike

我有一个对象

我想要实现的是将每个一级键名称作为字符串获取,并将这些字符串分组到新数组中,每个数组用于特定组。然后,根据每个正则表达式模式内的匹配顺序对每个组数组进行排序。

我目前拥有的是将字符串分组到新数组中的代码,但在数组中时不对它们进行排序。

我目前得到的是:

["firstName", "lastName", "birthDate", "birthPlace", "fatherName", "identityCard", "pesel", "passportNo", "passportExpirationDate", "citizenship"] // output of generalSectionElements

但我想要的是数组已经排序,因此 citizenship 字符串应该位于 fatherName 之后,而不是在数组的末尾。就像上面的正则表达式模式中的匹配顺序一样。

我确信这是可能的,但我无法全神贯注,任何人都可以至少给我一些提示吗? :/

const generalSectionPattern = /^(fir|las|(?=\w+D)bir\w+|(?=\w+P)bir\w+|fat|cit|ide|pes|(?=\w+N)pas\w+|(?=\w+E)pas\w+)/
const contactSectionPattern = /^(ema|mob|pre)/
const positionSectionPattern = /^(pos)/
const editorialSectionPattern = /((?!\w+Phone)edi\w*|(?=\w+Phone)edi\w*|fax)/
const flightSectionPattern = /^(bus|car|par|hot|pla|tra|des)/

const generalSectionElements = Object.keys(myObj).filter(elem => generalSectionPattern.test(elem))

console.log(generalSectionElements)
<script>
const myObj = {
"firstName": { "fieldType": "TEXT", "value": null, "enabled": true, "required": true },
"lastName": { "fieldType": "TEXT", "value": null, "enabled": true, "required": true },
"editorialOffice": { "fieldType": "TEXT", "value": null, "enabled": true, "required": true },
"email": { "fieldType": "TEXT", "value": null, "enabled": true, "required": true },
"birthDate": { "fieldType": "DATE", "value": null, "enabled": true, "required": true },
"birthPlace": { "fieldType": "TEXT", "value": null, "enabled": true, "required": false },
"fatherName": { "fieldType": "TEXT", "value": null, "enabled": true, "required": true },
"identityCard": { "fieldType": "TEXT", "value": null, "enabled": true, "required": true },
"bothDocuments": false,
"pesel": { "fieldType": "TEXT", "value": null, "enabled": true, "required": true },
"passportNo": { "fieldType": "TEXT", "value": null, "enabled": true, "required": false },
"passportExpirationDate": { "fieldType": "DATE", "value": null, "enabled": true, "required": false },
"pressCardNumber": { "fieldType": "TEXT", "value": null, "enabled": true, "required": true },
"editorialOfficePhone": { "fieldType": "TEXT", "value": null, "enabled": true, "required": true },
"fax": { "fieldType": "TEXT", "value": null, "enabled": true, "required": false },
"mobilePhone": { "fieldType": "TEXT", "value": null, "enabled": true, "required": true },
"position": { "fieldType": "RADIO", "value": null, "enabled": true, "required": true },
"citizenship": { "fieldType": "TEXT", "value": null, "enabled": true, "required": true },
"plane": { "fieldType": "SELECT", "value": null, "enabled": true, "required": false },
"bus": { "fieldType": "SELECT", "value": null, "enabled": true, "required": false },
"hotel": { "fieldType": "SELECT", "value": null, "enabled": true, "required": false },
"transmission": { "fieldType": "TEXT", "value": null, "enabled": true, "required": false },
"parking": { "fieldType": "SELECT", "value": null, "enabled": true, "required": false },
"carInfo": { "fieldType": "TEXT", "value": null, "enabled": true, "required": false },
"statement": { "fieldType": "TEXT", "value": null, "enabled": true, "required": true },
"descriptiveFields": [
{ "fieldType": "RADIO", "value": null, "enabled": false, "required": false },
{ "fieldType": "TEXTAREA", "value": null, "enabled": false, "required": false },
{ "fieldType": "TEXT", "value": null, "enabled": false, "required": false }
]
}
</script>

最佳答案

好的,浏览 Mozilla 开发者网络上的 JS Array 文档,我已经测试了我的问题的解决方案。

这是代码

const myObj = {
"firstName": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": true
},
"lastName": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": true
},
"editorialOffice": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": true
},
"email": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": true
},
"birthDate": {
"fieldType": "DATE",
"value": null,
"enabled": true,
"required": true
},
"birthPlace": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": false
},
"fatherName": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": true
},
"identityCard": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": true
},
"bothDocuments": false,
"pesel": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": true
},
"passportNo": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": false
},
"passportExpirationDate": {
"fieldType": "DATE",
"value": null,
"enabled": true,
"required": false
},
"pressCardNumber": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": true
},
"editorialOfficePhone": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": true
},
"fax": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": false
},
"mobilePhone": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": true
},
"position": {
"fieldType": "RADIO",
"value": null,
"enabled": true,
"required": true
},
"citizenship": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": true
},
"plane": {
"fieldType": "SELECT",
"value": null,
"enabled": true,
"required": false
},
"bus": {
"fieldType": "SELECT",
"value": null,
"enabled": true,
"required": false
},
"hotel": {
"fieldType": "SELECT",
"value": null,
"enabled": true,
"required": false
},
"transmission": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": false
},
"parking": {
"fieldType": "SELECT",
"value": null,
"enabled": true,
"required": false
},
"carInfo": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": false
},
"statement": {
"fieldType": "TEXT",
"value": null,
"enabled": true,
"required": true
},
"descriptiveFields": [{
"fieldType": "RADIO",
"value": null,
"enabled": false,
"required": false
},
{
"fieldType": "TEXTAREA",
"value": null,
"enabled": false,
"required": false
},
{
"fieldType": "TEXT",
"value": null,
"enabled": false,
"required": false
}
]
}

const generalSectionPatterns = [/^(fir)/, /^(las)/, /^((?=\w+D)bir\w+)/, /^((?=\w+P)bir\w+)/, /^(fat)/, /^(cit)/, /^(ide)/, /^(pes)/, /^((?=\w+N)pas\w+)/, /^((?=\w+E)pas\w+)/]
const contactSectionPatterns = [/^(ema)/, /^(mob)/, /^(pre)/]
const positionSectionPatterns = [/^(pos)/]
const editorialSectionPatterns = [/^((?!\w+Phone)edi\w*)/, /^((?=\w+Phone)edi\w*)/, /^(fax)/]
const flightSectionPatterns = [/^(bus)/, /^(car)/, /^(par)/, /^(hot)/, /^(pla)/, /^(tra)/, /^(des)/]

const generalSectionElements = generalSectionPatterns.map(pattern => Object.keys(myObj).find(elem => pattern.test(elem)))
console.log('sorted generalSectionElements:\n', generalSectionElements)

const contactSectionElements = contactSectionPatterns.map(pattern => Object.keys(myObj).find(elem => pattern.test(elem)))
console.log('sorted contactSectionElements:\n', contactSectionElements)

const positionSectionElements = positionSectionPatterns.map(pattern => Object.keys(myObj).find(elem => pattern.test(elem)))
console.log('sorted positionSectionElements:\n', positionSectionElements)

const editorialSectionElements = editorialSectionPatterns.map(pattern => Object.keys(myObj).find(elem => pattern.test(elem)))
console.log('sorted editorialSectionElements:\n', editorialSectionElements)

const flightSectionElements = flightSectionPatterns.map(pattern => Object.keys(myObj).find(elem => pattern.test(elem)))
console.log('sorted flightSectionElements:\n', flightSectionElements)

您可以在 repl.it 实时测试代码还有。

第二个解决方案是使用regex-sort :

function regexSort(list, patterns) {
function presetIndex(input) {
for (var i = 0; i < patterns.length; ++i) {
if (patterns[i].test(input)) {
return i;
}
}
return Infinity;
}

let indexes = list.map(c => ({
input: c,
index: presetIndex(c)
}));

indexes.sort(
(a, b) => a.index < b.index ? -1 : 1
);

return indexes.map(c => c.input);
};

第三个可能是将一些 Array 方法与 .sort() 结合起来,但正如我上面所写的,没有弄清楚在 sort 的比较器函数中到底要比较什么......

无论如何,感谢您对我的问题感兴趣并给我任何答复!干杯!

关于javascript - 如何通过正则表达式模式匹配对字符串数组中的元素进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60993278/

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