所以在我看来,有多种方法可以实现您的目标,
- 使用
filter 和include 就像我上面提到的一些 -
它会起作用,但我不知道当您使用过滤器在 arr2 上迭代然后对于您在 arr1 上迭代的每个元素以查看是否存在匹配的情况时,它的效率如何,我不知道您对算法有多熟悉分析,但它的 O(N power 2) 时间效率不是很高,这意味着随着 arr1 或 arr2 的快速增长,您的函数将需要更长的时间才能运行,如果您确实使用该选项,请先使用sort(),这样可以节省时间并提高效率。
参见示例:
let namesToRemove = ["Tom", "Harry", "Patrick"].sort()
let names = ["Miguel", "Harry", "Patrick", "Felipe", "Mario", "Tom"].sort()
let lastNameToRemove = namesToRemove[namesToRemove.length - 1]
names = names.filter((name) => {
if (name[0] > lastNameToRemove[0]) {
return true
}
return !namesToRemove.includes(name)
})
console.log(names)
请记住,如果您将使用 for loop 和 splice(),您可以直接中断,这样效率会更高。
- 使用
Map - 你可以在你的第一个数组上迭代一次并在JS中创建一个映射,它只使用一个对象表示法,一次在你的names数组上并检查是否有匹配,你可以使用@987654328改进它@ 和其他改进,但想法是,请参见下面的示例。
参见示例:
let namesToRemove = ["Tom", "Harry", "Patrick"]
let names = ["Miguel", "Harry", "Patrick", "Felipe", "Mario", "Tom"]
let namesToRemoveMap = {}
for (name of namesToRemove) {
namesToRemoveMap[name] = true
}
names = names.filter((name) => !namesToRemoveMap[name])
console.log(names)
当然,无论您选择哪种方式,我都会包括一些更多的防御性检查,例如数组是否具有值等...
希望我能解释清楚,如果您需要更多帮助或有任何问题,请告诉我。