У меня есть массив строк, как показано ниже,

const arr = [
    "list-domain/1/",
    "list-domain/1/list/1",
    "some-group/2/",
    "some-group/2/list/2",
    "list/3/",
    "list/3/item/1"
];

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

"list-domain/1/" or "some-group/2/" or "list/3/"

Здесь числа после / могут быть любыми. значение в «list-domain/1» здесь 1 может быть 2 или 3 любым числом, которое я должен проверить, содержит ли строка список-домен или некоторую группу или список, за которым следует / и любое число, за которым следует /

Поэтому для приведенного выше массива ожидаемый результат верен.

Теперь рассмотрим массив ниже,

const arr1 = [
    "list-domain/1/list/1",
    "some-group/2/list/2",
    "list/3/item/1"
];

Для arr1 ожидаемый вывод ложный, хотя есть строки list-domain/1, some-group/2 и list/3, но за ними следуют и другие строки, такие как list-domain/1/list/1, some-group/2 /список/2, список/3/элемент/1

Поэтому я хочу найти точные номера строк, которые могут быть любыми после /. может кто-нибудь помочь мне, как это сделать. благодаря.

РЕДАКТИРОВАТЬ:

Я хочу, чтобы он возвращал true, если строка имеет "list/1/" или

Любая строка, за которой следует «список/1», но возвращает false, если за «списком/1» следует другая строка, как показано ниже

 "list-domain/1/list/1/item/1"

Верно в случаях ниже

"list-domain/1/list/1"
"list/2"
"some-group/3/list/3"
0
stackuser 4 Фев 2022 в 13:39
" Я хочу проверить, содержит ли массив строки вида "list-domain/1/", "some-group/2/" или "list/3/" ". Вы хотите сопоставить точную строку "list-domain/1/" или ввод будет выглядеть примерно так: ["list-domain", "some-group", "list"]
 – 
adiga
4 Фев 2022 в 13:53
Да, я хочу сопоставить точную строку. и никакого ввода не будет, как вы упомянули. за ним будет следовать / и некоторое число и / поэтому строки будут выглядеть как list-domain/1/ или some-group/1/ или list/2/. меня интересуют эти строки
 – 
stackuser
4 Фев 2022 в 13:59
Я также хочу вернуть true, если строка «список/2/» имеет другую строку раньше. поэтому он должен возвращать true и для этих строк: "some-group/2/list/2/", "list-domain/4/list/3/", "list/2/"
 – 
stackuser
4 Фев 2022 в 14:24

3 ответа

Лучший ответ

Это дает вам требуемый результат с использованием регулярного выражения (RegExp):

arr.some(a=> new RegExp(/^(list-domain|some-group|list)\/[0-9]+\/$/g).test(a))
0
RaiBnod 4 Фев 2022 в 14:35
Наряду с этим, как я могу также сопоставить строку, содержащую, например, "some-group/2/list/2/" или "list-domain/4/list/2/" . так что в основном list/2/, но перед этой строкой тоже может быть что угодно. как я могу добавить это регулярное выражение выше?
 – 
stackuser
4 Фев 2022 в 14:16
2
Вы можете удалить map и сделать его: arr.some(a => new RegExp(...).test(a))
 – 
adiga
4 Фев 2022 в 14:21
@stackuser, просто обновите выражение регулярного выражения по своему усмотрению: arr.map(a=> new RegExp(/^(list-domain|some-group|list)\/[0-9]+(\/list\/[0-9]+)?\/$/g).test(a))
 – 
RaiBnod
4 Фев 2022 в 14:33
Я не хочу возвращать true для строк "list-domain/2/", "some-group/3/", поэтому я переписал регулярное выражение так: arr.map(a=> new RegExp(/^(+\ /item\/[0-9]+\/$/g).test(a)).some(value => value === true); но это дает ошибку, я думаю, что неправильно написал регулярное выражение.
 – 
stackuser
4 Фев 2022 в 14:35
arr1.some(a=> new RegExp(/\/item\/[0-9]+\/$/g).test(a)); это может быть то, что вы хотите иметь.
 – 
RaiBnod
4 Фев 2022 в 14:46

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

const arr = [
    "list-domain/1/",
    "list-domain/1/list/1",
    "some-group/2/",
    "some-group/2/list/2",
    "list/3/",
    "list/3/item/1"
];

const parse = (str) => {
    const parts = str.split('/');
    return parts.reduce((parsed, part, i, parts) => {
        if (part === '') return parsed;
        if (i % 2 === 0) {
            parsed[part] = null;
        } else {
            parsed[parts[i-1]] = part;
        }
        return parsed;
    }, {});
}

arr.forEach(s => {
    console.log(parse(s));
})

// returns:
// {list-domain: "1"}
// {list-domain: "1", list: "1"}
// {some-group: "2"}
// {some-group: "2", list: "2"}
// {list: "3"}
// {list: "3", item: "1"}

Он возвращает объект, где ключи — это строковые идентификаторы, а значения — числовые идентификаторы. Однако, как я уже сказал, он зависит от точной формы строки и регулярного изменения идентификатора и значения.

0
mika.koshonson 4 Фев 2022 в 14:02

Используйте регулярное выражение. Вот пример.

const rx = /^(([^\/]+)\/(\d+)\/)+$/
// or without the groups
const rxNoGroups = /^([^\/]+\/\d+\/)+$/

const found = items.filter(it => rx.test(it))

Это регулярное выражение проверяет

  • начало ввода
  • без косой черты
  • слэш
  • число
  • слэш
  • конец ввода или следующая группа

Адаптируйте его к вашим потребностям. Я закодировал его таким образом, что ваши слова, не являющиеся числами, могут содержать числа, поэтому foo/2/bar3/4/. Вы также можете ограничить количество повторений.

Вы также можете просто проверить, что строка заканчивается на /.

0
Steven Spungin 4 Фев 2022 в 14:15