提问人:RamAlx 提问时间:6/8/2017 最后编辑:ggorlenRamAlx 更新时间:12/17/2022 访问量:75055
检查字符串数组是否包含子字符串 [duplicate]
Check if an array of strings contains a substring [duplicate]
问:
我有一个这样的数组:
array = ["123", "456", "#123"]
我想找到包含子字符串的元素。我试过了,但没有用。"#"
array.includes("#")
array.indexOf("#")
如何检查此数组中是否有任何字符串包含子字符串?"#"
答:
因为 includes 会将 '#' 与每个数组元素进行比较。
var array = ["123", "456", "#123"];
var el = array.find(a =>a.includes("#"));
console.log(el)
评论
map
find
var el = array.map(a => a.includes("#") ? a : false).filter(Boolean);
array.filter(a =>a.includes("123"));
您可以使用过滤器 ()。
var array = ["123", "456", "#123"];
console.log(array.filter(function(item){
var finder = '#';
return eval('/'+finder+'/').test(item);
}));
通过传递函数,您可以过滤并返回与您要查找的内容匹配的元素。
在这个例子中,我使用了 eval (),只是因为要获取字符串使用 RegExp,但可以使用 == 运算符获取。
评论
new RegExp()
eval
includes
由于标题和帖子正文不同,这里似乎有多个问题。你想知道数组是否有一个元素,或者你想得到元素本身?如果你想得到一个元素,你想要哪一个 - 第一次出现,最后一次出现还是所有出现的数组?
这篇文章旨在为未来的访问者提供资源,他们可能不一定想要(即从与谓词匹配的数组的开头返回第一个元素),如顶部答案所示。为了详细说明这个答案,在布尔上下文中不加选择地替换为有一个问题——返回的元素可能是错误的,如find
some
find
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
每个元素都与谓语匹配吗?
const array = ["123", "456", "#123"];
console.log(array.every(e => e.includes("#"))); // false
console.log(array.every(e => /\d/.test(e))); // true
与谓词匹配的第一个元素是什么?
const array = ["123", "456", "#123", "456#"];
console.log(array.find(e => e.includes("#"))); // "#123"
console.log(array.find(e => e.includes("foobar"))); // undefined
与谓词匹配的第一个元素的索引是什么?
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"))); // []
与谓词匹配的最后一个元素是什么?
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"))); // []
您可以使用 join 方法:
array.join('').indexOf("#")
使用 Array.some:
array.some((item) => item.includes('#'));
它只是检查某些项目是否包含“#”——可读且清晰。
评论
array.some(x => x.includes(y))
array.find(item => item.includes('#'))