我有一个看起来像这样的字符串:
/link-to-page?foo=bar&test=1
另外,我有一个看起来像这样的对象:
{
key: '/',
foo: 'bar',
test: false,
mock: 'data'
}
我想实现的事情很简单(我认为),但也许我在这里没有发现明显的问题:
我要检查对象的任何值是否包含在字符串中。
我的第一个想法就是这样做:
Object.keys(obj).map(o => str.includes(obj[o]))
-显然,这只会返回一个布尔数组。
尝试一下:Object.keys(obj).map(o => obj[o]).some(s => str.includes(s))
也不起作用,因为它可能会提供误报(在我的对象中,我有一个值为key
的{{1}},不应将其考虑在内,但它会在此处返回/
-如果可以的话,我只想搜索“实际文本”。
我应该首先转换对象键和字符串以摆脱任何true
还是有另一种方法?
谢谢!
答案 0 :(得分:1)
您可以使用替换方法摆脱任何/
let oldstr = '/link-to-page?foo=bar&test=1';
let str = oldstr.replace('/', '');
console.log(str)
let obj = {
key: '/',
foo: 'asd',
test: false,
mock: 'data'
}
let a = Object.values(obj).some(s => str.includes(s))
console.log(a);
答案 1 :(得分:0)
您可以使用正则表达式避免匹配字符
str="/link-to-page?foo=bar&test=1"
ob={
key: '/',
foo: '/',
test: false,
mock: '/'
}
path=/[a-zA-Z]/
res=Object.values(ob).some(o=>path.test(o)?str.includes(o):false)
console.log(res)
答案 2 :(得分:0)
您可以存储有用的属性,然后遍历它们以检查对象内部并防止过滤:
const data = '/link-to-page?foo=bar&test=1';
const relevantProperties = ['foo', 'test', 'mock'];
const obj = {
key: '/',
foo: 'bar',
test: false,
mock: 'data'
};
for (let i = 0; i < relevantProperties.length; ++i) {
const property = relevantProperties[i];
if (data.includes(obj[property])) {
console.log(property);
break;
}
}
答案 3 :(得分:0)
遍历对象值,然后使用.match
方法检查值是否包含在给定的字符串中。如果过滤后的数组的长度为>0
,则表示找到匹配项
let obj = {
key: '/',
foo: 'bar',
test: false,
mock: 'data'
}
let str = '/link-to-page?foo=bar&test=1'
let matchedValues = Object.values(obj).filter(x=>str.match(x)) // will return an array of all matching values
// -> (2) ["/", "bar"]
if(matchedValues.length > 0){
console.log("Matches found")
}else{
console.log("Matches found")
}
答案 4 :(得分:0)
单线
let isinclude=(str,obj)=>(str=str.replace('/',''),Object.keys(obj).reduce((a,v)=>a || str.includes(v),false))