Учитывая следующую 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 - но это не мой вопрос:)