Единственное назначение деструктуризации для получения значений из результата, возвращаемого RegExp.exe c () - PullRequest
0 голосов
/ 08 апреля 2020

Учитывая следующую findMatches функцию, которая возвращает несколько настраиваемый результат из RegExp.prototype.exec().

Демо:

/**
 * Ensures a new RegExp has a specified flag such as the global `g`.
 *
 * @param {String} flags - The string containing the current flag(s).
 * @param {String} flag - The flag to ensure is set, e.g. `g`.
 * @returns {String} The new flag(s) inclcuding the specified flag.
 */
function ensureRegExpHasFlag(flags, flag) {
  return flags.includes(flag) ? flags : `${flags}${flag}`;
}

/**
 * @typedef matchesInfo
 * @desc An Array of Objects with details of each match found.
 * @type {Object[]}
 * @property {String} fullMatch - The full string of characters matched.
 * @property {Number} matchLength - The no. of characters in the matched string.
 * @property {Number} startIndex - The start index for the matched string.
 * @property {Number} endIndex - The end index for the matched string.
 */

/**
 * Find all matches of a pattern in a given string.
 *
 * @param {String} data - The string to match a regular expression against.
 * @param {Object} regExp - The regular expression written as a literal value.
 * @returns {matchesInfo} An Array of Objects with details of each match found.
 */
function findMatches(data, regExp) {
  regExp = new RegExp(regExp, ensureRegExpHasFlag(regExp.flags, 'g'));

  const matchesInfo = [];
  let match;

  while ((match = regExp.exec(data))) {

    const [ fullMatch ] = match;
    const { index: startIndex } = match;

    matchesInfo.push({
      fullMatch,
      matchLength: fullMatch.length,
      startIndex,
      endIndex: startIndex + fullMatch.length
    });
  }

  return matchesInfo;
}

const haystack = 'The quick brown fox jumps over the quick dog';

const needles = findMatches(haystack, /quick/);

console.log(needles)

Примечание: Приведенный выше код в настоящее время возвращает правильный желаемый результат следующим образом:

[
  {
    "fullMatch": "quick",
    "matchLength": 5,
    "startIndex": 4,
    "endIndex": 9
  },
  {
    "fullMatch": "quick",
    "matchLength": 5,
    "startIndex": 35,
    "endIndex": 40
  }
]

Вопрос:

Можно ли провести рефакторинг следующих двух строк деструктуризации (в тексте while l oop выше) в одно назначение деструктуризации?

const [ fullMatch ] = match;
const { index: startIndex } = match;

Мне кажется странным, что результат , возвращаемый из exec(), является одновременно массивом и объектом. Кажется, что в массиве нет вложенности объектов , поэтому что-то вроде следующего одиночного деструктурирующего назначения (или его вариантов) не работает:

const [ fullMatch, { index: startIndex } ] = match;

Примечание: Мне известна функция matchAll, которая недавно появилась в ECMAScript 2020 - но это не мой вопрос:)


Ответы [ 2 ]

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

Конечно, вам здесь не нужна повторяемая деструктуризация, вы просто хотите получить доступ к свойству 0 результата совпадения:

const { 0: fullMatch, index: startIndex } = match;
1 голос
/ 08 апреля 2020

Конечно, это возможно:

let m = /foo/.exec('seafood');
let { [0]: fullMatch, index: startIndex } = m;

console.log(fullMatch, startIndex);

Я бы этого не написал, хотя бы вообще использовал деструктуризацию с несоответствующим именем свойства:

const [ fullMatch ] = match;
const startIndex = match.index;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...