#javascript
#javascript
Вопрос:
Итак, я играю, пытаясь создать ввод, который я могу ввести, а затем показывать только те объекты, которые имеют соответствующий текст. Я приближаюсь, но мне нужна небольшая помощь. Я думаю, что то, что я сделал, работает, но я считаю, что может быть лучший способ.
Поэтому я ожидаю, что пользователь на входе может ввести следующие значения:
- телефон
- Адрес электронной почты
- FirstName
- Фамилия
- Имя фамилия
Я думаю, что код, который у меня есть, работает для всего этого, но не уверен, что мне нравится то, что я сделал для имени и фамилии. Интересно, должен ли я использовать регулярное выражение вместо того, что я делаю. Мысли?
export let customers = [
{
id: 1,
firstName: 'John',
lastName: 'Smith',
email: 'john.smith@test.com',
phone: '7025551234',
},
{
id: 2,
firstName: 'Jonathan',
lastName: 'Harken',
email: 'jonathan.harken@test.com',
phone: '7165551234',
},
{
id: 3,
firstName: 'Zack',
lastName: 'Moss',
email: 'zack.moss@test.com',
phone: '9995551234',
},
];
export const filterList = (suggestions, searchValue) => {
return suggestions.filter((sug) => {
let shouldReturn = false;
for (const [key, keyValue] of Object.entries(sug)) {
if (key !== 'id') {
let keyV = keyValue.toLowerCase();
let hasSpace = searchValue.indexOf(' ') > -1;
if (!hasSpace amp;amp; keyV.indexOf(searchValue) > -1) {
shouldReturn = true;
}
if (hasSpace) {
let split = searchValue.split(' ');
switch (key) {
case 'firstName':
if (keyV.indexOf(split[0]) > -1) {
shouldReturn = true;
}
break;
case 'lastName':
if (keyV.indexOf(split[1]) > -1) {
shouldReturn = true;
}
break;
default:
break;
}
}
}
}
if (shouldReturn) {
return sug;
} else {
return null;
}
});
}
Я просто думаю, что что-то не так.
Комментарии:
1.
indexOf
для поиска статических фрагментов текста все в порядке. Единственное улучшение, которое я мог видеть в приведенном здесь регулярном выражении, заключается в том, что вы можете сделать весь поиск нечувствительным к регистру, просто установив соответствующий флаг. (Но это то, что вы можете иметь и с indexOf, если сначала вы вводите вводимый текст и значение поиска в нижнем регистре.)
Ответ №1:
Эта более простая версия должна вести себя как ваша функция.
let customers = [{
id: 1,
firstName: 'John',
lastName: 'Smith',
email: 'john.smith@test.com',
phone: '7025551234',
},
{
id: 2,
firstName: 'Jonathan',
lastName: 'Harken',
email: 'jonathan.harken@taest.com',
phone: '7165551234',
},
{
id: 3,
firstName: 'Zack',
lastName: 'Moss',
email: 'zack.moss@test.com',
phone: '9995551234',
},
];
function filterByValue(objectList, searchValue) {
const tokens = searchValue.toLowerCase().split(' ');
return Object.values(objectList).filter(entry => {
return Object.values(entry).some(entryValue => {
if (typeof(entryValue) !== 'string')
return false;
entryValue = entryValue.toLowerCase();
return tokens.every(token => entryValue.includes(token));
})
})
}
console.log(filterByValue(customers, '.com'))
console.log(filterByValue(customers, '555 234'))
console.log(filterByValue(customers, 'John 555'))
console.log(filterByValue(customers, 'John test .com'))