@TomasFaber

Как найти верный индекс элемента массива?

Есть массив сonst arr =['King', 'Queen', 'Sword', 'King', 'Armor', 'King'];

Текст получаю из ввода инпут и меняю тип на массив, мне нужно реализовать, что когда пользователь наводит курсор на слово King выдать его верный индекс. (слушатель срабатывает только со словом King. т.е курсор над первым King должно выдавать индекс 0. если на последнем то индекс 5)
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
Big_Trouble
@Big_Trouble
Программист недосамоучка
<div class="container"></div>

const run = () => {
	const words =['King', 'Queen', 'Sword', 'King', 'Armor', 'King'];
  const $container = document.querySelector(".container");

  const getIndexes = (arr, target) => {
    return arr.reduce((acc, word, i) => {
      if(target === word) {
        acc.push({
          name: word,
          index: i
        })
      } else {
        acc.push({name: word});
      }
      return acc
    }, [])
  }
  const insertHTML = (list) => {
    list.forEach((item) => {
    	if(item.index !== undefined) {
      	var template = `<div data-index="${item.index}">${item.name}</div>`;
      } else {
      	var template = `<div data-index="">${item.name}</div>`
      }
      
      $container.insertAdjacentHTML('beforeend', template)
    })
  }
  
  insertHTML(getIndexes(words, "King"))
  
  
	$container.addEventListener('mouseover', (e) => {
  	const index = e.target.getAttribute('data-index');
    if(index) {
    	console.log(index)
    }
  })
}
run()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dollar
@dollar
Делай добро и бросай его в воду.
Очевидно, слово "King" не может однозначно соответствовать индексу, т.к. их несколько в массиве. Нужен другой подход (или их комбинация).

Например, по координате в инпуте: getArrIndex(x), где x - координата в каких-то удобных вам единицах. Естественно, эту функцию нужно будет самому написать. Если текст с переносами, то придётся мутить что-то типа getArrIndex(x,y)

Также можно попробовать ещё один подход: getLastWordIndex(text), в котором функция смотрит на последнее слово в тексте и выдаёт его номер. То есть здесь text - это весь текст от начала до позиции курсора включительно и включая слово под курсором, но всё остальное обрезано.

Можно ещё что-нибудь придумать. Выбирайте, что вам кажется более удобным и разумным, - и реализуйте это.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы