考虑到我有以下JSON对象
.trimText{
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis
}
,如果我有字符串var urls = {
"GET/users/:id":1,
"POST/users":0
}
。如何使用它作为从JSON网址中获取值的键,即"GET/users/10"
应该与"GET/users/10"
匹配。
我不想迭代urls JSON并为每个键使用正则表达式。
是否可以使用正则表达式访问JSON对象?
谢谢。
答案 0 :(得分:2)
这应该对您有用。我从Durandal router's RegEx matching logic中提取了一些片段,这些片段基本上是根据定义的路由字符串动态创建regular expression object,然后将tests
与传递的字符串相对应。
这是工作示例:
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'))
因此,您拥有的是getRouteRegExp
函数,这是这里的主要内容,它将基于传递的route
组成一个正则表达式对象。
此后,我们为urls
中定义的每个现有路线创建一个RegExp,并尝试将其与提供的string route
进行匹配。 find
就是这样做的。如果找到一个,我们将其退回。
由于我们正在执行Object.entries,因此我们返回包含结果的0索引。
由于这是直接从Durandal位获得的,因此它支持在Durandal中内置的所有路由表达式...例如:
tickets
tickets/:id
users(/:id)
settings*details
您可以阅读有关Durandal Router here
的更多信息答案 1 :(得分:0)
根据您的问题,我可以理解的是您的密钥是动态的,因此您可以执行以下操作:
var urls = {
"GET/users/:id":1,
"POST/users":0
}
let id = 10
const yourValue = urls["GET/users/" + id]
答案 2 :(得分:0)
您可以使用此代码
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)
}
答案 3 :(得分:0)
尝试这样的事情:
const urls = (id) => ({
[`GET/users/${id}`]:1,
"POST/users":0,
});
console.log(urls(2));
我希望它会有所帮助。
答案 4 :(得分:0)
json看起来不错,只需对url进行替换,因此将结尾整数替换为:id,然后您便拥有了可直接访问json中值的键。 所以:
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]);
对url进行尽可能多的替换,以将所有可能的url转换为json中的键。