Создайте функцию, которая принимает массив для поиска, массив ключей свойств для поиска и значение для поиска. Если массив ключей свойств пуст, то, вероятно, не должно быть никакого фильтра, вернуть все элементы.
- Использовать array: some для возврата true / false, если выполняется одно из условий ключей свойств.
- Используйте string :: includes, чтобы проверить, содержит ли строка подстроку.
функция searchBy
const searchBy = (arr = [], searchKeys = [], value = '') => {
return arr.filter(item =>
searchKeys.length ? searchKeys.some(key =>
(item[key] || "").toLowerCase().includes(value.toLowerCase())
) : true
);
};
Использование
handleByNameChange = (e) => {
const { value } = e.target;
const updatedList = this.props.userData.allUsersForFilter;
this.setState({
byNameInputValue: value,
items: searchBy(updatedList, ['firstName', 'lastName'], value),
});
};
const data = [
{ firstName: "Martin", lastName: "Jonas" },
{ firstName: "Brad", lastName: "Mickle" },
{ firstName: "Summer", lastName: "Bride" },
{ firstName: "Axel", lastName: "Rod" },
{ firstName: "Mike", lastName: "Haxel" }
];
const searchBy = (arr = [], searchKeys = [], value = '') => {
return arr.filter(item =>
searchKeys.length ? searchKeys.some(key =>
(item[key] || "").toLowerCase().includes(value.toLowerCase())
) : true
);
};
console.log(searchBy(data, [], "Martin"));
console.log(searchBy(data, ["lastName"], ""));
console.log(searchBy(data, ["firstName"], "Martin"));
console.log(searchBy(data, ["firstName"], "Summer"));
console.log(searchBy(data, ["firstName", "lastName"], "ax"));
Приложение - поиск объединенного полного имени
const searchByName = (arr = [], value = "") => {
return arr.filter(({ firstName = '', lastName = '' }) =>
[firstName, lastName, `${firstName} ${lastName}`].some(el =>
el.toLowerCase().includes(value.toLowerCase())
)
);
};
Пытается сопоставить имя или фамилию, затем полное имя
const data = [
{ firstName: "Martin", lastName: "Jonas" },
{ firstName: "Brad", lastName: "Mickle" },
{ firstName: "Summer", lastName: "Bride" },
{ firstName: "Axel", lastName: "Rod" },
{ firstName: "Mike", lastName: "Haxel" }
];
const searchByName = (arr = [], value = "") => {
return arr.filter(({ firstName = '', lastName = '' }) =>
[firstName, lastName, `${firstName} ${lastName}`].some(el =>
el.toLowerCase().includes(value.toLowerCase())
)
);
};
console.log(searchByName(data, "Martin"));
console.log(searchByName(data, ""));
console.log(searchByName(data, "Summer"));
console.log(searchByName(data, "ax"));
console.log(searchByName(data, "Mike Ha"));
Весь код в демонстрационной песочнице
Редактировать несколько значений массива фильтров