Как отфильтровать Array of Strings по Array of Strings, разрешив частичное совпадение - PullRequest
0 голосов
/ 06 ноября 2018

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

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 ]

0 голосов
/ 06 ноября 2018

Помимо использования 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);
0 голосов
/ 06 ноября 2018

var rawData = ["foo", "bar", "foobar", "barbaz", "boo" ]
var unwantedData = ["foo","baz"]
var cleanData = rawData.filter((item)=> !unwantedData.includes(item))
console.log(cleanData)
0 голосов
/ 06 ноября 2018

Вы можете .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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...