Как сделать так, чтобы includes()
в some()
соответствовало всем случаям?
let instance = ['m6gd.medium', '1 vCPU', '4 GiB'];
// let search = "medium"; // true
// let search = "4gb"; // true
// let search = "medium 4gb"; // true
let search = "medium 12gb"; // true - need to make this false - need AND condition
let found = instance.some(s1 =>
{
console.info("s1 = ", s1.toLowerCase());
let search_term = search.toLowerCase();
search_term = search_term.replace(/gb/g, "gib");
search_term = search_term.replace(/(\d+)(gib)/g, "$1 $2");
console.info("search_term = ", search_term);
return search_term.split(' ').some(s2 =>
{
console.info("s2 = ", s2.toLowerCase(), "\n");
return s1.toLowerCase().includes(s2.toLowerCase())
});
});
console.info(found);
Используйте array.foreach для разделенного поискового термина и в обратном вызове для проверки array.foreach, что вызов некоторой функции в стоге сена возвращает true. вот как бы я это сделал.
let instance = ["m6gd.medium", "1 vCPU", "4 GiB"];
// let search = "medium"; // true
// let search = "4gb"; // true
// let search = "medium 4gb"; // true
let search = "medium 12gb"; // true - need to make this false - need AND condition
let search_term = search.toLowerCase();
search_term = search_term.replace(/gb/g, "gib");
search_term = search_term.replace(/(\d+)(gib)/g, "$1 $2");
let notFound = false;
//false for now, but we will split search term,
//then perform array.foreach on each split item to see if it is contained in instance array. If so, this becomes true
search_term.split(" ").forEach(el => {
if (!instance.some(s => {
return s.toLowerCase().includes(el.toLowerCase())
}))
{
notFound = true;
}
})
console.info(!notFound);
Спасибо за вопрос, действительно, похоже, есть способ без foreach, он также может работать быстрее. Я недостаточно опытен, чтобы знать, но вот код:
let instance = ["m6gd.medium", "1 vCPU", "4 GiB"];
// let search = "medium"; // true
// let search = "4gb"; // true
// let search = "medium 4gb"; // true
let search = "medium 12gb"; // true - need to make this false - need AND condition
let search_term = search.toLowerCase();
search_term = search_term.replace(/gb/g, "gib");
search_term = search_term.replace(/(\d+)(gib)/g, "$1 $2");
let result = compare(search_term.split(" "), instance)
function compare(searchArray, comparisonArray) {
// Convert all items in the comparison array to lowercase
const comparisonArrayLowercase = comparisonArray.map((item) => item.toLowerCase());
// Check if every item in the search array is a substring of at least one item in the comparison array
return searchArray.every((searchItem) =>
comparisonArrayLowercase.some(
(comparisonItem) => comparisonItem.includes(searchItem.toLowerCase())
)
);
}
console.info(result);
Спасибо за ваше решение - я думал, что теперь это можно решить с помощью функций ES2022 или чего-то еще вместо использования цикла forEach.
Нет проблем, я только что узнал, что вы можете сделать это без foreach, и обновил свой ответ, чтобы показать, как вместо этого использовать методы Array.prototype.every() и Array.prototype.some()
every
вместоsome