Преобразуйте слова в RegExp (с флагом i
- игнорируйте регистр) и используйте RegExp.test()
, чтобы найти, содержится ли слово в product_name
:
// takes a criteria, converts to regex, and returns a filter function
const filterByCriteria = (searchCriteria) => {
const searchRegex = new RegExp(_.words(searchCriteria).join('|'), 'i');
// the filtering functions expects a data souce and filters it
return (ds) => ds.filter(o => searchRegex.test(o.product_name));
};
/** Usage: **/
var dataSource1 = [{"_id":"5968dd23fc13ae04d9000001","product_name":"sildenafil citrate","supplier":"Wisozk Inc","quantity":261,"unit_cost":"$10.47"},{"_id":"5968dd23fc13ae04d9000002","product_name":"Mountain Juniperus ashei","supplier":"Keebler-Hilpert","quantity":292,"unit_cost":"$8.74"},{"_id":"5968dd23fc13ae04d9000003","product_name":"Sample HBr","supplier":"Schmitt-Weissnat","quantity":211,"unit_cost":"$20.53"}];
var dataSource2 = [{"_id":"5968dd23fc13ae04d90000021","product_name":"Hybrid product","supplier":"Wisozk Inc","quantity":261,"unit_cost":"$10.47"},{"_id":"5968dd23fc13ae04d90000022","product_name":"Mountain Sample Juniperus ashei","supplier":"Keebler-Hilpert","quantity":292,"unit_cost":"$8.74"},{"_id":"5968dd23fc13ae04d90000033","product_name":"Dextromathorphan HBr","supplier":"Schmitt-Weissnat","quantity":211,"unit_cost":"$20.53"}];
const searchCriteria = 'sample hybrid';
const filterDs = filterByCriteria(searchCriteria);
const searchResult = {
first: filterDs(dataSource1),
second: filterDs(dataSource2),
};
console.log(searchResult);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>
Проблема в вашем коде - функция compareEachWord()
, которая немедленно возвращается.Поскольку вы хотите, чтобы функция немедленно возвращала результат, только если он равен true
, и, если нет, итерацию до конца, вы можете использовать Array.some()
:
var dataSource1 = [{"_id":"5968dd23fc13ae04d9000001","product_name":"sildenafil citrate","supplier":"Wisozk Inc","quantity":261,"unit_cost":"$10.47"},{"_id":"5968dd23fc13ae04d9000002","product_name":"Mountain Juniperus ashei","supplier":"Keebler-Hilpert","quantity":292,"unit_cost":"$8.74"},{"_id":"5968dd23fc13ae04d9000003","product_name":"Sample HBr","supplier":"Schmitt-Weissnat","quantity":211,"unit_cost":"$20.53"}];
var dataSource2 = [{"_id":"5968dd23fc13ae04d90000021","product_name":"Hybrid product","supplier":"Wisozk Inc","quantity":261,"unit_cost":"$10.47"},{"_id":"5968dd23fc13ae04d90000022","product_name":"Mountain Sample Juniperus ashei","supplier":"Keebler-Hilpert","quantity":292,"unit_cost":"$8.74"},{"_id":"5968dd23fc13ae04d90000033","product_name":"Dextromathorphan HBr","supplier":"Schmitt-Weissnat","quantity":211,"unit_cost":"$20.53"}];
const searchCriteria = 'sample hybrid';
const searchResult = {};
function compareEachWord(str, searchCriteria) {
var word = searchCriteria.split(" ");
return word.some(w => str.includes(w));
}
function filterFromDS1() {
const result = _.filter(dataSource1, (item) => {
return compareEachWord(_.toLower(item.product_name), searchCriteria);
});
return result;
}
function filterFromDS2() {
const result = _.filter(dataSource2, (item) => {
return compareEachWord(_.toLower(item.product_name), searchCriteria);
});
return result;
}
searchResult['first'] = filterFromDS1();
searchResult['second'] = filterFromDS2();
console.log(searchResult);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>