我正在寻找一种有效的方法来从 JavaScript 数组中删除项目(如果它们存在于另一个数组中)。使用 indexOf

I am looking for an efficient way to remove items from a JavaScript array if they are present in another array. Using indexOf

我想从 arr_2 中删除那些包含来自 arr_1

的域名的项目

let arr_1 = ["domain1.com", "domain2.com"];

let arr_2 = [
  "domain1.com/about-us",
  "domain3.com/contact-us",
  "domain4.com/privacy-policy",
  "domain2.com/pricing-plans",
  "sub.domain2.com/home-1",
];

let filtered_arr = [];

arr_2.forEach((item) => {
  if (item.indexOf(arr_1) == -1) {
    filtered_arr.push(item);
  }
});

console.log(filtered_arr);

我想要此代码的结果 ["domain3.com/contact-us", "domain4.com/privacy-policy"],但它会打印整个 arr_2

您的代码现在正在 return 处理整个 arr_2,因为您的过滤逻辑不会检查 arr_2 的每一项是否包含 arr_1 中的匹配字符串之一].

indexOf(arr_1) 本质上是在 arr_2 中的每个项目中搜索整个 arr_1 数组。该函数将始终 return -1 因为 arr_2 的每个项目都是一个字符串,永远不会与整个 arr_1 数组匹配。

我假设您也想遍历 arr_1 中的每个项目,因此您可能应该在 forEach 循环中为 arr_2 执行 arr_1.forEach((item1) => { }),并在此内部循环中执行 indexOf 检查。

您不能对字符串调用 indexOf 并将数组作为参数传递。
您应该使用 find 检查 item 是否有来自 arr_1.
的域 而且使用 filter 的代码比 forEach.

更简洁

let arr_1 = ["domain1.com", "domain2.com"];

let arr_2 = [
  "domain1.com/about-us",
  "domain3.com/contact-us",
  "domain4.com/privacy-policy",
  "domain2.com/pricing-plans",
  "sub.domain2.com/home-1",
];

let filtered_arr = arr_2.filter(item => {
  return !arr_1.find(domain => item.includes(domain));
});

console.log(filtered_arr);

注意:这也会过滤掉“example.com/domain1.com”。

您可以使用 filter someincludes

来实现

let arr_1 = ["domain1.com", "domain2.com"];

let arr_2 = [
  "domain1.com/about-us",
  "domain3.com/contact-us",
  "domain4.com/privacy-policy",
  "domain2.com/pricing-plans",
  "sub.domain2.com/home-1",
];

const arr3 = arr_2.filter(url => !arr_1.some(domain => url.includes(domain)))

console.log(arr3)