#javascript #reactjs
Вопрос:
Я создаю проект react, в котором я использую таблицу, и мне нужно добавить в нее функцию поиска. Прямо сейчас таблица заполнена объектами.
function createData(Estimate, ServiceProvider, Vehicle, Date, Amount, Status, Action) {
return {Estimate, ServiceProvider, Vehicle, Date, Amount, Status, Action};
}
const rows = [
createData('#10001', "Euro Motors", "2010 Toyota Corolla CE FWD", "January 28, 2021", "$395.11", "Approved",),
createData('#10002', "Auto Motors", "Some car model", "January 28, 2021", "$395.11", "Pending"),
createData('#10003', "Some other Motors", "Some other car model", "January 28, 2021", "$395.11", "Approved"),
]
const [tableData, setTableData] = useState(rows)
Прямо сейчас у меня есть функция поиска только для поставщика услуг, использующего это
const requestSearch = (searchedVal) => {
const filteredRows = rows.filter((row) => {
return row.ServiceProvider.toLowerCase().includes(searchedVal.toLowerCase());
});
setTableData(filteredRows);
};
но мне это нужно для Оценки, поставщика услуг, Транспортного средства. Как я могу расширить функциональность на все три, чтобы независимо от того, что пользователь ищет в строке поиска, он проверял все три столбца и отфильтровывал строки с повторением.
Комментарии:
1. Просто добавьте условия для оценки и транспортного средства и объедините их с помощью
||
оператора вrequestSearch
функции.2. @CharchitKapoor это также заботится о повторениях?
3. Репитиции в каком смысле? Каждая строка, соответствующая более чем одному критерию, появится только один раз.
4. @CharchitKapoor ваше решение хорошее. Не могли бы вы, пожалуйста, ответить на вопрос, чтобы я мог его принять
Ответ №1:
Просто добавьте условия для Estimate
, и Vehicle
и объедините их с помощью ||
оператора внутри requestSearch
функции, вот так:
return row.ServiceProvider.toLowerCase().includes(searchedVal.toLowerCase()) ||
row.Estimate.toLowerCase().includes(searchedVal.toLowerCase()) ||
row.Vehicle.toLowerCase().includes(searchedVal.toLowerCase())
Ответ №2:
Вы можете написать общее решение для всех ключей, фактически не упоминая ключи по отдельности. Попробуйте выполнить следующий фрагмент кода:
const requestSearch = (searchedVal) => {
const filteredRows = rows.filter((row) => {
let found = Object.values(row).map(o => o.toLowerCase()).find(o => o.includes(searchedVal));
if(found) return true;
else return false;
});
console.log(filteredRows);
};
Примечание: это будет работать, если все ваши значения поиска являются строковыми, для числа вам нужно будет добавить к нему некоторую условную обработку.