Сравните два массива и удалите элементы с частичным совпадением

#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. Спасибо. Работает отлично! И в одной строке кода … многому нужно научиться…