过滤打字稿/ JavaScript

时间:2019-12-27 18:30:03

标签: javascript typescript

考虑一个数组A1 ["text", "test"]和另一个数组A2 ["onetest", "two", "threetext", "fourtext"]

我需要将结果作为["onetest", "threetext", "fourtext"]

这是我目前拥有的

A2.filter(r => r !== null && A1.indexOf(r) > -1);

这将返回空列表。我该如何解决?

4 个答案:

答案 0 :(得分:2)

  1. r是一个字符串,因此r.text既不必要也不正确。
  2. 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.textundefined,您可能只想使用{ {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 );

如果字符串包含第一个数组元素中的某些元素,它将过滤每个元素的第二个数组。