Как фильтровать массив строк с помощью массива строк, позволяющий выполнять частичные совпадения

У меня есть строки в массиве и нужно удалить записи, содержащие строки. Но также удаление частичных матчей.

var rawData = ["foo", "bar", "foobar", "barbaz", "boo" ]
var unwantedData = ["foo","baz"]
var cleanData = filter(rawData,unwantedData)
console.log(cleanData)
>>>["bar","boo"]

Мое текущее решение выглядит следующим образом:

function filter(data,filterArray){
  return data.filter(rawEntry => {
    var t = true; // set to false if index is found
    filterArray.forEach(unwantedStr => { t = t && ~rawEntry.indexOf(unwantedStr) ? false : t });
    return t; //decides if entry gets removed by filter
  });
}

Но я чувствую, что может быть более хороший способ сделать это. Вероятно, это не самый эффективный способ вычисления.

Всего 3 ответа


Вы можете использовать .filter() используя .every() и .includes() .

 let rawData = ["foo", "bar", "foobar", "barbaz", "boo"], unwantedData = ["foo", "baz"]; let filterData = (a1, a2) => a1.filter(s => a2.every(v => !s.includes(v))); console.log(filterData(rawData, unwantedData)); 


Помимо использования Array#every , вы можете сделать то же самое, инвертируя логику и используя Array#some .

 var rawData = ["foo", "bar", "foobar", "barbaz", "boo"], unwantedData = ["foo", "baz"], result = rawData.filter(s => !unwantedData.some(t => s.includes(t))); console.log(result); 


 var rawData = ["foo", "bar", "foobar", "barbaz", "boo" ] var unwantedData = ["foo","baz"] var cleanData = rawData.filter((item)=> !unwantedData.includes(item)) console.log(cleanData) 


Есть идеи?

10000