#javascript #arrays #google-apps-script #compare
#javascript #массивы #google-apps-script #Сравнить
Вопрос:
Мне нужно сравнить два массива для ЧАСТИЧНЫХ совпадений / ПОДСТРОК. Если они найдены, я хочу, чтобы соответствующие элементы были удалены из originalArray или создать новый массив со всеми теми элементами, которые не имели частичного совпадения,
var originalArray = ['www.google.com/opq', 'www.yelp.com/abc', 'www.yahoo.com/klm', 'www.bing.com/xyz', 'www.google.com/124'];
var itemsToBeRemoved = ['google.com', 'yahoo.com'];
// DESIRED ARRAY: An array with items that did not have a partial match. For example:
var cleanArray = ['www.yelp.com/abc', 'www.bing.com/xyz']
Это работает, когда его ПОЛНОЕ / ТОЧНОЕ совпадение.
Но это НЕ то, что мне нужно.
function cleanFullMatch(){
// Your main array
var originalArray = ['www.google.com/rugby', 'www.yelp.com/abc', 'www.yahoo.com/tennis', 'www.bing.com/xyz', 'www.google.com/football'];
Logger.log(originalArray);
// This array contains strings that needs to be removed from main array
var itemsToBeRemoved = ['www.google.com/rugby', 'www.yahoo.com/tennis', 'www.google.com/football'];
var cleanObj = {};
itemsToBeRemoved.forEach( e => cleanObj[e] = true);
itemsToBeRemoved.forEach( e => itemsToBeRemoved[e]= true);
var cleanArray = originalArray.filter(function(val){ return !cleanObj [val] })
Logger.log(cleanArray);
}
Комментарии:
1. Использовать
includes()
илиindexOf()
Ответ №1:
Вы можете использовать регулярное выражение JavaScript для создания регулярного выражения и array.filter(функция) для удаления элементов, которые не соответствуют регулярному выражению.
Пример кода:
function cleanFullMatch(){
// Your main array
var originalArray = ['www.google.com/rugby', 'www.yelp.com/abc', 'www.yahoo.com/tennis', 'www.bing.com/xyz', 'www.google.com/football'];
Logger.log(originalArray);
// This array contains strings that needs to be removed from main array
var itemsToBeRemoved = ['google.com', 'yahoo.com', 'google.com'];
// loop through itemsToBeRemove
itemsToBeRemoved.forEach(function(rgx){
// convert each element of itemsToBeRemove to regular expression
var re = new RegExp(rgx);
// filter the array by removing the elements that match the regex
// test() method checks if the string matches the regex
originalArray = originalArray.filter( word => !re.test(word));
});
Logger.log(originalArray);
}
Пример вывода:
Комментарии:
1. Спасибо! Также работает очень хорошо. Я могу сам использовать «новое регулярное выражение» и в других сценариях.
Ответ №2:
отфильтруйте элементы originalArray
, чтобы ни один из itemsToBeRemoved
них не присутствовал ни в одном из отфильтрованных элементов.
Существует много способов проверить, включена ли подстрока в другую строку, как говорили другие, например, includes , indexOf и RegExp .
Затем вы можете перебирать все это itemsToBeRemoved
разными способами. Вы могли бы, например, использовать некоторые:
function cleanFullMatch(){
var originalArray = ['www.google.com/rugby', 'www.yelp.com/abc', 'www.yahoo.com/tennis', 'www.bing.com/xyz', 'www.google.com/football'];
var itemsToBeRemoved = ['google.com', 'yahoo.com'];
var cleanArray = originalArray.filter(element => !itemsToBeRemoved.some(item => element.includes(item)));
console.log(cleanArray);
}
Или, альтернативно, каждый:
var cleanArray = originalArray.filter(element => itemsToBeRemoved.every(item => !element.includes(item)));
Как вы можете видеть, процесс фильтрации может быть сведен к одной строке.
Комментарии:
1. Спасибо. Работает отлично! И в одной строке кода … многому нужно научиться…