Відповідність маршруту JSON через регулярні вирази

Подумайте, я маю наступний об'єкт JSON

var urls = {
  "GET/users/:id":1,
  "POST/users":0
}

і якщо я маю рядок "GET/users/10" . Як використовувати це як ключ для отримання значення з URL-адрес JSON, тобто "GET/users/10" , має відповідати "GET/users /: id" .

Я не хочу повторювати urls JSON і використовувати regex для кожного ключа.

Чи є спосіб доступу до об'єкту JSON за допомогою регулярного виразу?

Заздалегідь спасибі.

3
Там впевнений, щось. Хоча це жахлива ідея. Можна трохи пограти з це .
додано Автор Akaino, джерело

5 Відповіді

Ось щось для вас. Я взяв деякі фрагменти з Логіка збігу RegEx маршрутизатора Durandal , яка в основному динамічно створює

Ось робочий приклад:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

var urls = {
  "GET/users/:id": 1,
  "POST/users": 0
}

const getRouteRegExp = (
  routeString,
  routesAreCaseSensitive = false,
  optionalParam = /\((.*?)\)/g,
  namedParam = /(\(\?)?:\w+/g,
  splatParam = /\*\w+/g,
  escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g
) => {
  routeString = routeString.replace(escapeRegExp, '\\$&')
    .replace(optionalParam, '(?:$1)?')
    .replace(namedParam, function(match, optional) {
      return optional ? match : '([^\/]+)';
    })
    .replace(splatParam, '(.*?)');

  return new RegExp('^' + routeString + '$', routesAreCaseSensitive ? undefined : 'i');
}

const getRouteByString = (string) => {
  var resultArr = Object.entries(urls).find(([k, v]) => {
    var regEx = getRouteRegExp(k)
    return regEx.test(string)
  }) || []
  return resultArr[0]
}

console.log(getRouteByString('GET/users/10'))
console.log(getRouteByString('POST/users'))
console.log(getRouteByString('POST/users2'))
</div> </div>

Отже, у вас є функція getRouteRegExp , яка є головною річчю, яка буде створювати об'єкт регулярного виразу на основі переданого маршруту .

Після цього ми виходимо і для кожного існуючого маршруту, визначеного в urls , ми створюємо один RegExp і намагаємося зрівняти його з наданим рядком маршруту . Ось що робить find . Якщо знайдено, ми повертаємо його.

Оскільки ми займаємося Object.entries ми повертаємо індекс 0, який містить результат.

Оскільки це відбувається безпосередньо з бітів Durandal, він підтримує всі вирази маршруту, які побудовані в Durandal ... як:

  • Static route: tickets
  • Parameterized: tickets/:id
  • Optional Parameter: users(/:id)
  • Splat Route: settings*details

You can read more about Durandal Router here

2
додано
Високий. Якщо це вирішить вашу проблему, ви повинні прийняти її як відповідь, щоб інші могли знайти її легше.
додано Автор Akrion, джерело
Завдяки @Akrion, вище рішення дуже корисно. :)
додано Автор imv_90, джерело

Цей код можна використовувати для

var urls = {
  "GET/users/:id":1,
  "POST/users":0
}
var regex = /"([^"]+?)"\s*/g;
var urlsJson = JSON.stringify(urls);
let result = regex.exec(urlsJson)
if(result && result.length > 0) {
  var keyJson = result[1];
  var value = urls[keyJson]
  console.log('value', value)
}
1
додано

Json буде виглядати нормально, просто зробіть заміну на url, так що замінити кінцеве ціле з: id, а потім у вас є ключ, за яким ви можете безпосередньо отримати доступ до значення в json. Тому:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

var url = "GET/users/10";

var urls = {
  "GET/users/:id":1,
  "POST/users":0
}


url = url.replace(/users\/\d+/, 'users/:id');
console.log(urls[url]);
</div> </div>

Зробіть стільки, що замінює URL, щоб перетворити всі можливі URL-адреси на ключі у вашому json.

0
додано

З вашого питання, що я можу зрозуміти, ваш ключ є динамічним, так що ви можете зробити щось подібне:

var urls = {
  "GET/users/:id":1,
  "POST/users":0
}
let id = 10

const yourValue = urls["GET/users/" + id]
0
додано
з цим "GET/users /" + id він створить GET/users/10 , який не працюватиме
додано Автор imv_90, джерело

Спробуйте щось подібне:

const urls = (id) => ({
   [`GET/users/${id}`]:1,
    "POST/users":0,   
});

console.log(urls(2));

Я сподіваюся, що це може бути корисним.

0
додано
dev-ua/node
dev-ua/node
1 122 учасників

Chat for Node.js developers. We love other non-frontend JS environments too!

ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram