Поиск объекта в массиве с несколькими свойствами

#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'))