检查对象值的任何部分是否包含在字符串

时间:2020-07-25 06:45:13

标签: javascript string object functional-programming

我有一个看起来像这样的字符串: /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还是有另一种方法?

谢谢!

5 个答案:

答案 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))