Скажем, у меня есть следующие массивы:
var array_full = ['table', 'sleeping', 'data'];
var array_part = ['sleep', 'able'];
Теперь я хочу отфильтровать элементы из массива с полными строками (array_full
), если они содержат элементы из массива с частичными строками (array_part
).
Я могу сделать это так:
var rez = [];
for (p in array_part) {
array_full.filter(function(f) { if (f.indexOf(array_part[p]) > -1) {rez.push(f)} } )
}
Но я уверен, что есть лучший способ, не так ли?
Обновлено: Всем спасибо!
Вы можете отфильтровать массив и найти часть, включающую в себя
Array#filter
для фильтрации array_full
сArray#some
за нахождение части array_part
с помощьюString#includes
, проверка, содержит ли строка другую строку.var array_full = ['table', 'sleeping', 'data'],
array_part = ['sleep', 'able'],
result = array_full.filter(s => array_part.some(p => s.includes(p)));
console.info(result);
Сохраняйте порядок array_part
с Set
, потому что в противном случае вы можете получить более одного предмета из array_full
.
var array_full = ['table', 'sleeping', 'data'],
array_part = ['sleep', 'able'],
result = Array.from(array_part.reduce(
(r, p) => array_full.reduce((q, s) => s.includes(p) ? q.add(s) : q, r),
new Set
));
console.info(result);
это немного сложнее. у вас есть только один подходящий элемент?
Извините, что вы подразумеваете под "одним совпадающим предметом"? array_part
имеет два предмета, которые частично совпадают с предметами в array_full
...
О, возможно ли, что элемент из array_part
соответствует более чем 1 элементу в array_full
? Тогда нет, это невозможно.
объявление 2 и в каком порядке вы хотите тогда?
В том же порядке эти частичные совпадения перечислены в array_part
. Если array_part = ['sleep', 'able']
, то результат должен быть ['sleeping', 'table']
.
см. редактирование.
Вы можете использовать some
и includes
следующим образом:
const array_full = ['table', 'sleeping', 'data'];
const array_part = ['sleep', 'able'];
const output = array_full.filter(a => array_part.some(b => a.includes(b)))
console.info(output)
includes
и стрелочные функции — это синтаксис ES2015+. Если вы хотите ES5, вы можете сделать что-то вроде этого
var array_full = ['table', 'sleeping', 'data'];
var array_part = ['sleep', 'able'];
var output = array_full.filter(function(a) {
return array_part.some(function(b) {
return a.indexOf(b) > -1
})
})
console.info(output)
Если ваш вариант использования действительно касается поиска строк в строках:
вы можете построить регулярное выражение из array_part
Если вы знаете, что частичные слова состоят из словесных символов и не содержат специальных символов для регулярных выражений, таких как (*, $ . и т. д.), вы можете скомпилировать array_part
в регулярное выражение:
var array_full = ['table', 'sleeping', 'data'];
var array_part = ['sleep', 'able'];
let rx = new RegExp(array_part.join('|'))
console.info(array_full.filter(w => rx.test(w)))
whis работает, только если строки не содержат специальных символов регулярного выражения.
var array_full = ['table', 'sleeping', 'data'];
var array_part = ['sleep', 'able'];
var rez = array_full.filter(item => array_part.some(str => item.includes(str)));
console.info(rez);
Извините за задержку, но что, если мне нужно отфильтровать эти
array_full
элементы в соответствии с указанным порядкомarray_part
? Мол,['sleeping', 'table']
, а не['table', 'sleeping']
. Итерация по спискуarray_part
, как это сделано в посте, очевидно, позволяет это сделать. Но, к сожалению, не ваш хороший анлайнер. Может есть обходной путь? Спасибо :)