Как отфильтровать большой массив строк по массиву подстрок? - PullRequest
0 голосов
/ 30 ноября 2018

Я использую angular для фильтрации большого набора строк для поля автозаполнения.Какой самый эффективный способ сделать это?

largeArrayOfStrings = ['string1', 'string2', 'test one', 'one', 'two test', 'three', 'test one two', ...]
substring = [‘test’, ‘one’, ‘two’]

values = substringArray.map(h.includes)
// I would want values to be the following
values = ['test one two']
// That is the only string that contains all the strings from substring array.

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Это был бы один из способов сделать это:

const strings = ['string1', 'string2', 'test one', 'one', 'two test', 'three', 'test one two']
const subs = ['test', 'one', 'two']

const result = strings.filter(x => subs.every(y => x.includes(y)))

console.log(result)

Использование Array.filter в сочетании с Array.every и String.includes.

Идея состоит в том, чтобы начать с фильтра слов и убедиться, что для подстроки every в вашем массиве subs вы получите попадание в текущее слово основного массива.Это происходит только для 'test one two', как показано.

0 голосов
/ 03 декабря 2018

ОК, поэтому я писал библиотеку для таких вещей, и нашел довольно простое решение этой самой проблемы.Код изначально написан на TypeScript, но я преобразовал его в JS:

const filterArray = (arr, toKeep) => {
    for (item of toKeep)
        arr = arr.filter(i => i = toKeep);

    return arr;
};

Это означает, что эта функция предполагает, что в массиве могут быть элементы, отличные от строк, и если вы хотитеубедитесь, что строки, просто добавьте эту строку в начале функции:

for (arrIetm of arr) if (Object.prototype.toString.call(arrItem) != '[object String]' return;

Кстати, если вы хотите проверить библиотеку, GitHub находится по этой ссылке: https://railrunner16.me/raildash/

С наилучшими пожеланиями и удачи!

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

Превратите h в набор, который имеет постоянное время поиска:

  const toFilter = new Set(h);

  const result = substringArray.filter(el => toFilter.has(el));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...