У меня есть массив input
следующим образом.
const input = [
'_rels', 'item1.xml',
'item2.xml', 'item3.xml',
'item4.xml', 'item5.xml',
'item6.xml', 'item7.xml',
'itemProps1.xml', 'itemProps2.xml',
'itemProps3.xml', 'itemProps4.xml',
'itemProps5.xml', 'itemProps6.xml',
'itemProps7.xml'
]
Массив может включать любую строку.
Я хотел бы отфильтровать массив item{number}.xml
, не включая itemProps{number}.xml
.
Ожидаемый результат будет следующим:
const output = [
'item1.xml', 'item2.xml', 'item3.xml', 'item4.xml', 'item5.xml', 'item6.xml', 'item7.xml'
]
в массиве может быть много других элементов без префикса item
.
Затем сохраните все элементы, которые начинаются с item
, но не itemProps
. По-прежнему не требует регулярного выражения.
если я отфильтрую элементы, начинающиеся с item
, то itemProps1.xml
также будут включены в результат, но я просто хочу только item1.xml, item2.xml, ...
.
Вы пропустили часть моего комментария "... но не itemProps
"
могут быть любые элементы, даже itemblablabl.xml, и мне нужно их исключить.
Вы явно просите item
и itemProps
в вопросе. Как мы (я) должны знать, что могут быть другие item*
записи? -> "Как сохранить только записи item{Number}.xml
из входного массива?"
Вы можете использовать методы RegExp.prototype.test()
и Array.prototype.filter
для получения результата.
const input = [
'_rels', 'item1.xml',
'item2.xml', 'item3.xml',
'item4.xml', 'item5.xml',
'item6.xml', 'item7.xml',
'itemProps1.xml', 'itemProps2.xml',
'itemProps3.xml', 'itemProps4.xml',
'itemProps5.xml', 'itemProps6.xml',
'itemProps7.xml'
];
const res = input.filter(item => /^item\d+\.xml$/i.test(item));
console.info(res);
Вы можете воспользоваться регулярным выражением в сочетании с методом Array.prototype.reduce
, подобным этому
const input = [
'_rels', 'item1.xml',
'item2.xml', 'item3.xml',
'item4.xml', 'item5.xml',
'item6.xml', 'item7.xml',
'itemProps1.xml', 'itemProps2.xml',
'itemProps3.xml', 'itemProps4.xml',
'itemProps5.xml', 'itemProps6.xml',
'itemProps7.xml'
]
const regExPattern = /itemProps\d+\.xml/
const result = input.reduce((acc, current) => {
if (regExPattern.test(current) === false){
return acc.concat(current);
}
return acc;
}, []);
console.info(result);
Это просто усложненная версия ответа Саджиба .filter()
(и в ней также отсутствует запись _rels
)
Я внес изменения, чтобы принимать только элементы, которые начинаются с item
и содержат любое количество цифр, за которыми следует .xml
Почему регулярное выражение? Просто найдите
itemProps
.