考虑一个数组A1 ["text", "test"]
和另一个数组A2 ["onetest", "two", "threetext", "fourtext"]
我需要将结果作为["onetest", "threetext", "fourtext"]
这是我目前拥有的
A2.filter(r => r !== null && A1.indexOf(r) > -1);
这将返回空列表。我该如何解决?
答案 0 :(得分:2)
r
是一个字符串,因此r.text
既不必要也不正确。A1.indexOf(r) > -1
检查字符串r
是否包含在数组A1
中。对于您的任何物品都不是这样。使用r.text
代替r
。要确定字符串r
是否包含A1
中的任何子字符串,可以使用.some
和.includes()
:
const A1 = ["text", "test"];
const A2 = ["onetest", "two", "threetext", "fourtext"];
const result = A2.filter(r => r !== null && A1.some(a => r.includes(a)));
console.log(result);
答案 1 :(得分:2)
我看到两个问题:首先,A2
的元素没有名为text
的属性,因此r.text
是undefined
,您可能只想使用{ {1}}。
第二,r
不是您想要的。 A1.indexOf
既是数组方法又是字符串方法,并且我认为您感到困惑。数组方法用于查找完全匹配的索引,而字符串方法可用于查找子字符串的位置。您想要确定indexOf
的 any 成员是否作为子字符串出现在A1
的给定成员中。我建议使用A2
方法,该方法确定给定谓词对于数组的 any 成员是否为真。在其中,我们可以使用字符串方法Array.prototype.some
创建一个谓词。
看看这是否适合您:
indexOf
答案 2 :(得分:1)
您可以通过检查模式字符串的每个值进行过滤。
var a1 = ["text", "test"],
a2 = ["onetest", "two", "threetext", "fourtext"],
result = a2.filter(s => a1.some(p => s.includes(p)));
console.log(result);
答案 3 :(得分:0)
A1.indexOf(r)
仅检查数组的元素是否与给定的文本完全匹配,如果不是,则在搜索子字符串。
尝试一下:
var a1 = ["text", "test"];
var a2 = ["onetest", "two", "threetext", "fourtext"];
var filtered = a2.filter( e => a1.some( e2 => e.indexOf( e2 ) != -1 ) );
console.log( filtered );
如果字符串包含第一个数组元素中的某些元素,它将过滤每个元素的第二个数组。