【问题标题】:filter in typescript/javascript在 typescript/javascript 中过滤
【发布时间】:2019-12-27 18:30:03
【问题描述】:

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

我需要得到["onetest", "threetext", "fourtext"]的结果

这是我目前拥有的

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

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

【问题讨论】:

标签: javascript typescript


【解决方案1】:
  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);

【讨论】:

  • 谢谢!如果 A1: object[] = {[id: 1, name:"text"], [id:2, name: "test"]} 和另一个数组 A2 ["onetest", "two", "threetext", "fourtext"] 并返回结果 ["onetest", "threetext", "fourtext"]?
【解决方案2】:

我看到了两个问题:首先,A2 的元素没有名为text 的属性,因此r.textundefined,您可能只想使用r

其次,A1.indexOf 不是你想要的。 indexOf 既是数组方法又是字符串方法,我想你把它们弄糊涂了。数组方法用于查找精确匹配的索引,而字符串方法可用于查找子字符串的位置。您想要确定A1any 成员是否作为A2 的给定成员中的子字符串存在。我建议使用Array.prototype.some 方法,该方法确定给定谓词对于数组的any 成员是否为真。在此我们可以使用字符串方法indexOf 创建一个谓词。

看看这是否适合你:

const A1 = ["text", "test"]
const A2 = ["onetest", "two", "threetext", "fourtext"]

// I need to get the result as ["onetest", "threetext", "fourtext"]

console.log(A2.filter(r => r !== null && A1.some(s => r.indexOf(s) > -1)))

【讨论】:

  • 谢谢!如果 A1: object[] = {[id: 1, name:"text"], [id:2, name: "test"]} 和另一个数组 A2 ["onetest", "two", "threetext", "fourtext"] 并返回结果 ["onetest", "threetext", "fourtext"]?
【解决方案3】:

您可以通过检查模式字符串的每个值来进行过滤。

var a1 = ["text", "test"],
    a2 = ["onetest", "two", "threetext", "fourtext"],
    result = a2.filter(s => a1.some(p => s.includes(p)));

console.log(result);

【讨论】:

  • 谢谢!如果 A1: object[] = {[id: 1, name:"text"], [id:2, name: "test"]} 和另一个数组 A2 ["onetest", "two", "threetext", "fourtext"] 并返回结果 ["onetest", "threetext", "fourtext"]?
  • 然后采取a2.filter(({ name }) => a1.some(p => name.includes(p)))
【解决方案4】:

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 );

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多