检查字符串数组是否包含子字符串 [duplicate]

Check if an array of strings contains a substring [duplicate]

提问人:RamAlx 提问时间:6/8/2017 最后编辑:ggorlenRamAlx 更新时间:12/17/2022 访问量:75055

问:

我有一个这样的数组:

array = ["123", "456", "#123"]

我想找到包含子字符串的元素。我试过了,但没有用。"#"array.includes("#")array.indexOf("#")

如何检查此数组中是否有任何字符串包含子字符串?"#"

JavaScript 数组

评论

12赞 georg 6/8/2017
尝试array.some(x => x.includes(y))
4赞 DonovanM 6/8/2017
我认为它会更像是array.find(item => item.includes('#'))

答:

76赞 taile 6/8/2017 #1

因为 includes 会将 '#' 与每个数组元素进行比较。

让我们尝试一些找出你是否想找到是否要得到确切的元素

var array = ["123", "456", "#123"];

var el = array.find(a =>a.includes("#"));

console.log(el)

评论

4赞 joey8oro 6/12/2019
“some”方法对于这种情况非常有用
0赞 king 7/27/2021
使用“一些”stackoverflow.com/questions/16312528/...
0赞 shorif2000 4/10/2022
这只找到第一个出现。我 wnt 得到所有机会
0赞 taile 4/11/2022
让我们用它来代替您的需求@shorif2000mapfindvar el = array.map(a => a.includes("#") ? a : false).filter(Boolean);
1赞 taile 12/7/2022
在这种情况下,您应该使用过滤器@VishalKumararray.filter(a =>a.includes("123"));
-1赞 GeekSilva 6/9/2017 #2

您可以使用过滤器 ()。

    var array = ["123", "456", "#123"];

    console.log(array.filter(function(item){
        var finder = '#';
        return eval('/'+finder+'/').test(item);
    }));

通过传递函数,您可以过滤并返回与您要查找的内容匹配的元素。

在这个例子中,我使用了 eval (),只是因为要获取字符串使用 RegExp,但可以使用 == 运算符获取。

评论

5赞 shinzou 4/24/2018
为什么选择Eval?{}{}{{}
0赞 ggorlen 5/2/2021
用代替,或者最好直接用 。如果子字符串恰好有特殊的正则表达式字符,则正则表达式方法会中断,因此这个答案在几个级别上都相当糟糕。new RegExp()evalincludes
17赞 ggorlen 5/2/2021 #3

由于标题和帖子正文不同,这里似乎有多个问题。你想知道数组是否有一个元素,或者你想得到元素本身?如果你想得到一个元素,你想要哪一个 - 第一次出现,最后一次出现还是所有出现的数组?

这篇文章旨在为未来的访问者提供资源,他们可能不一定想要(即从与谓词匹配的数组的开头返回第一个元素),如顶部答案所示。为了详细说明这个答案,在布尔上下文中不加选择地替换为有一个问题——返回的元素可能是错误的,如findsomefind

if ([5, 6, 0].find(e => e < 3)) { // fix: use `some` instead of `find`
  console.log("you might expect this to run");
}
else {
  console.log("but this actually runs " +
    "because the found element happens to be falsey");
}

请注意,它可以用任何谓词代替,因此它在很大程度上是问题的附带内容。e => e.includes("#")

当在条件中使用并且未能解释 0(在数组中的第一个位置找到元素)是假的事实时,也会出现同样的问题。indexOf


是否有任何元素与谓词匹配?

const array = ["123", "456", "#123"];
console.log(array.some(e => e.includes("#"))); // true
console.log(array.some(e => e.includes("foobar"))); // false

MDN: Array.prototype.some()

每个元素都与谓语匹配吗?

const array = ["123", "456", "#123"];
console.log(array.every(e => e.includes("#"))); // false
console.log(array.every(e => /\d/.test(e))); // true

MDN: Array.prototype.every()

与谓词匹配的第一个元素是什么?

const array = ["123", "456", "#123", "456#"];
console.log(array.find(e => e.includes("#"))); // "#123"
console.log(array.find(e => e.includes("foobar"))); // undefined

MDN:Array.prototype.find()

与谓词匹配的第一个元素的索引是什么?

const array = ["123", "456", "#123", "456#"];
console.log(array.findIndex(e => e.includes("#"))); // 2
console.log(array.findIndex(e => e.includes("foobar"))); // -1

MDN:Array.prototype.findIndex()

与谓词匹配的所有元素是什么?

const array = ["123", "456", "#123", "456#"];
console.log(array.filter(e => e.includes("#"))); // ["#123", "456#"]
console.log(array.filter(e => e.includes("foobar"))); // []

MDN: Array.prototype.filter()

与谓词匹配的最后一个元素是什么?

const array = ["123", "456", "#123", "456#"];
console.log(array.findLast(e => e.includes("#"))); // "456#"
console.log(array.findLast(e => e.includes("foobar"))); // undefined

MDN:Array.prototype.findLast()

与谓词匹配的最后一个元素的索引是什么?

const array = ["123", "456", "#123", "456#"];
console.log(array.findLastIndex(e => e.includes("#"))); // 3
console.log(array.findLastIndex(e => e.includes("foobar"))); // -1

MDN:Array.prototype.findLastIndex()

与谓语匹配的所有元素的索引是什么?

const filterIndices = (a, pred) => a.reduce((acc, e, i) => {
  pred(e, i, a) && acc.push(i);
  return acc;
}, []);

const array = ["123", "456", "#123", "456#"];
console.log(filterIndices(array, e => e.includes("#"))); // [2, 3]
console.log(filterIndices(array, e => e.includes("foobar"))); // []

MDN:Array.prototype.reduce()

1赞 Mohanad Walo 12/14/2021 #4

您可以使用 join 方法:

array.join('').indexOf("#")
2赞 user17668978 12/14/2021 #5

使用 Array.some

array.some((item) => item.includes('#'));

它只是检查某些项目是否包含“#”——可读且清晰。