Фильтровать значения по предоставленным данным

1

Я пытаюсь выполнить случай, когда введенный пользователем вход фильтрует список со значениями, которые могут быть либо словом, либо номером (как в виде строк).

Ниже приведены все описанные случаи, но мне интересно, есть ли способ объединить все три проверки случаев в один. Хорошее предложение очень ценится :)

Case 1: 1 === 1
Case 2: +1 === +1
Case 3: (+1) ==== (+1)

const form = document.querySelector('input')

form.addEventListener('change', () => {
  console.clear()
  filterValues()
})

const values = {
  first: {code: "1", name: "one"},
  second: {code: "2", name: "two"},
  third: {code: "3", name: "three"},
  four: {code: "4", name: "four"},
  five: {code: "5", name: "five"}
}

function filterValues() {
  Object.keys(values).forEach(value => {
    const code = values[value].code
    const name = values[value].name
    const input = form.value
    
    const inputMatchesCode = code.indexOf(input.toLocaleLowerCase()) === 0
    
    /* Code case nr 1 */
    const inputMatchesName = name.indexOf(input.toLocaleLowerCase()) === 0
    
    /* Code case nr 2 */
    const dialingCode = '+${code}'
    const inputMatchesDialingCode = dialingCode.indexOf(input.toLocaleLowerCase()) === 0
    
    /* Code case nr 3 */
    const fullDialingCode = '(+${code})'
    const inputMatchesFullDialingCode = fullDialingCode.indexOf(input.toLocaleLowerCase()) === 0
    
    if (inputMatchesCode || inputMatchesName || inputMatchesDialingCode || inputMatchesFullDialingCode) {
      console.log(value)
    }
  })
}
input {
  width: 100%;
  border: 1px solid #ccc;
  border-radius: 3px;
}
<input type="text" />

Теги:

1 ответ

1
Лучший ответ

Если вы пытаетесь сопоставить номер (например: 1), и ожидается, что изменения будут соответствовать вашим созданным строкам (например: "(+1)"), а не пытаться сопоставить все variations-, почему бы вам просто не удалите вспомогательные символы и сравните только числа - т.е. (1 === 1, чтобы дать "Первый"). Таким образом, вам не нужно учитывать символы "(", "+" или ")", если сам номер соответствует, вы можете дать ожидаемый результат.

Я использовал ваш код, но лишил альтернативных символов и логику разных случаев.

const form = document.querySelector('input')

form.addEventListener('change', () => {
  console.clear()
  filterValues()
})

const values = {
  first: {code: "1", name: "one"},
  second: {code: "2", name: "two"},
  third: {code: "3", name: "three"},
  four: {code: "4", name: "four"},
  five: {code: "5", name: "five"}
}

function filterValues() {
  Object.keys(values).forEach(value => {
    const code = values[value].code
    const name = values[value].name
    const input = form.value.replace(/[\(\+\)]/g,'');
    
    const inputMatchesCode = code.indexOf(input.toLocaleLowerCase()) === 0

    const inputMatchesName = name.indexOf(input.toLocaleLowerCase()) === 0
    

    if (inputMatchesCode || inputMatchesName) {
      console.log(value)
    }
  })
}
input {
  width: 100%;
  border: 1px solid #ccc;
  border-radius: 3px;
}
<input type="text" />
  • 0
    Спасибо, Гавгриф. Все лучшие решения действительно чистые и выглядят просто :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню