我正在寻找一种有效的方法来从 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
some
和 includes
来实现
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)
我想从 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
some
和 includes
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)