Как отсортировать элементы в массиве строк путем сопоставления с регулярным выражением - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть объект

То, чего я хочу достичь, - это получить каждое имя ключа 1-го уровня в виде строки и поместить эти строки в новые массивы, каждый массив для определенной группы c. Затем сортируйте каждый групповой массив в соответствии с порядком совпадений внутри каждого шаблона регулярных выражений.

В настоящее время у меня есть код, который группирует строки в новые массивы, но без сортировки их в массивах.

В настоящее время я получаю:

["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>

1 Ответ

1 голос
/ 02 апреля 2020

Хорошо, просматривая документы для JS Массив в Mozilla Developer Network, я проверил решение для моей проблемы.

Вот код

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 (), но, как я уже писал выше, не понял, что именно сравнивать внутри функции компаратора сортировки. ...

Спасибо, что все равно проявили интерес к моей проблеме и дали мне любой ответ! Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...