比较/筛选两个数组,其中数组B包含数组A中的任何子字符串。

3

好的,所以我部分地实现了这个功能(忽略大小写),比较以下内容:

arrayA = ["apples", "Oranges", "salt", "Cracked Black Pepper"];
arrayB = ["salt", "pepper", "orange"]

它在以下内容中“部分”地工作:

findAnyMatch(arrayA, arrayB): string[] {
    let returnArray = [];
    let conditionedArrayA = arrayA.map(i => i.toLowerCase().trim())
    for (let i = 0; i < arrayB.length; i++) {
      if (conditionedArrayA .includes(arrayB[i].toLowerCase().trim())) {
        ret.push(arrayB[i].toLowerCase().trim());
      }
    }
    return returnArray;
  }

这会很高兴地返回 "salt","orange";问题在于它找不到数组A中的"pepper",因为它前面有"cracked black"。

我该如何让它在条件数组A的每个字符串内任何地方进行搜索?

谢谢。


你的问题标题和正文描述不一致。"Cracked Black Pepper" 不是 "pepper" 的子字符串,但是忽略大小写后,"pepper" 是 "Cracked Black Pepper" 的子字符串。你的问题意图是要过滤两个数组,其中数组 B 包含 A 的任何子字符串吗? - Patrick Roberts
好的,改了。 - Logan
3个回答

4

你可以使用 filter 和 some 与正则表达式一起使用

  • filter 用于仅获取所需的值。
  • some 用于检查 arrayA 中的任何值是否与当前元素匹配。
  • 正则表达式用于匹配字符串。i 标志用于忽略大小写。

let arrayA = ["apples", "Oranges", "salt", "Cracked Black Pepper"];
let arrayB = ["salt", "pepper", "orange"]

let find = (A,B) => {
  return B.filter(b=> A.some(a=> new RegExp(b,'i').test(a)))
}

console.log(find(arrayA,arrayB))


只是一点小提示,请确保您的数组不是以任何方式来自用户输入的字符串。如果是,使用这个来转义字符串,然后再将它们传递给RegExp构造函数,否则您将面临漏洞。 - Patrick Roberts

1
arrayB 包含“needles”,而 arrayA 包含“haystacks”,因此可以使用 String.prototype.includes()。注意,您在尝试中实际上使用了 Array.prototype.includes(),这就是为什么它只匹配了"salt"(根据您的示例代码,我非常怀疑甚至"orange"也没有成功匹配)。
以下是使用 String.prototype.includes() 的解决方案:

function matchedSubstrings (haystacks, needles) {
  return needles.filter(function (needle) {
    const lowerCaseNeedle = needle.toLowerCase()
    return this.some(haystack => haystack.includes(lowerCaseNeedle))
  }, haystacks.map(haystack => haystack.toLowerCase()))
}

const arrayA = ["apples", "Oranges", "salt", "Cracked Black Pepper"]
const arrayB = ["Salt", "pepper", "orange"]

console.log(matchedSubstrings(arrayA, arrayB))

Array.prototype.filter()回调函数中的this是作为第二个参数传递的转换后的haystacks数组。

等效的TypeScript代码如下:

function matchedSubstrings (haystacks: string[], needles: string[]): string[] {
  return needles.filter(function (this: string[], needle) {
    const lowerCaseNeedle = needle.toLowerCase()
    return this.some(haystack => haystack.includes(lowerCaseNeedle))
  }, haystacks.map(haystack => haystack.toLowerCase()))
}

const arrayA = ["apples", "Oranges", "salt", "Cracked Black Pepper"]
const arrayB = ["Salt", "pepper", "orange"]

console.log(matchedSubstrings(arrayA, arrayB))

0

let arrayA = ["apples", "Oranges", "salt", "Cracked Black Pepper"];
let arrayB = ["salt", "pepper", "orange"]

let find = (A,B) => {
  return B.filter(b=> A.some(a=> new RegExp(b,'i').test(a)))
}

console.log(find(arrayA,arrayB))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接