Javascript для цикла сравнения текста элемента dom с массивом

Я сравниваю то, что находится в innerHTML элемента DOM, с тем, что находится в статическом текстовом массиве. То, что находится в элементе, всегда соответствует записи в текстовом массиве.

<p id = "main1">b</p>

var textArr = ["<p>a</p>","<p>b</p>","<p>c</p>"];
if (main1.innerHTML == textArr[0]) {
            return 0;
        } else if (main1.innerHTML == textArr[1]) {
            return 1;
        } else if (main1.innerHTML == textArr[2]) {
            return 2;
        } else if (main1.innerHTML == textArr[3]) {
            return 3;
        } else {
            return 0;
}
//returns 1

Вскоре я добавлю записи в textArr и пойму, что цикл for в любом случае намного лучше для такого случая. Однако мой условный оператор никогда не попадает в цикл.

var index;
for (index = 0; index < textArr.length; ++index) {
    if (main1.innerHtml == textArr[index]) {
        return index;
    } 
}
//does nothing

Как я могу сравнить, что находится в элементе, с тем, что находится в массиве?

Вы можете инвестировать в использование textContent вместо innerHTML просто потому, что innerHTML может возвращать вложенные теги, то есть div.innerHTML будет или может содержать <p>text</p> и т. д., Вы понимаете ... Кроме того, с предложением else вы можете захотеть вернуться - 1? ... Или, как вариант, вернуть textArr.indexOf(main1.textContent).

JO3-W3B-D3V 30.12.2018 17:05

Ваш код «ничего не делает», потому что innerHTML, а не innerHtml. Также есть встроенный метод для этого Array.prototype.indexOf (который даже обеспечивает более согласованный вывод, возвращающий -1, когда элемент не находится в массиве)

Yury Tarabanko 30.12.2018 17:09

@YuryTarabanko - Это правильный ответ. Я не могу сосчитать, сколько раз искал несоответствия корпусов. Спасибо

froggomad 30.12.2018 17:16

@YuryTarabanko Я рад, что вы это заметили, я это совсем не заметил!

JO3-W3B-D3V 30.12.2018 17:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
380
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Просто используйте Array.prototype.indexOf() вот так:

return textArr.indexOf(main1.textContent);

Это вернет индекс совпадающего текста из массива и элемента main1.

Вы были почти у цели.

var main = document.getElementById("main1").innerHTML;
var textArr = ["a", "b", "c"]


function check(value, array) {

  for (i = 0; i < textArr.length; i++) {
    if (value == array[i]) {
         return value + " is equal to " + array[i]
  } 
 }
}

document.write(check(main, textArr))
document.write("</br>" + check("a", textArr))
document.write("</br>" + check("h", textArr))
<p id = "main1" style = "display: none">b</p>

Попробуйте этот Array.prototype.find ():

var found = textArr.find(function(element) { 
  return main1.textContent == element;
});

он вернет содержимое соответствующего элемента.

Но будет ли это более эффективным, чем использование indexOf? Я имею в виду, что в таком небольшом сценарии, уверен, что это, вероятно, не имеет никакого значения в отношении производительности, я на самом деле не уверен на 100%, что было бы более эффективным.

JO3-W3B-D3V 30.12.2018 17:22

Он вернет undefined, а indexOf() вернет -1, если нет подходящего элемента, в любом случае я не думаю, что производительность важна в этой ситуации, подумайте, какой из них более удобен для вас.

Aria 31.12.2018 06:53

main1 не определен. Я бы просто установил этот innerHTML в переменную, а затем сравнил бы.

var arr = ["a", "b", "c", "d"];
var answer = document.getElementById("main1").innerHTML;
var index;
for (index = 0; index < arr.length; index++) {
    if (answer == arr[index]) {
        return index;
    } 
}

main1 на самом деле определен в моем коде, и я забыл включить его здесь, но независимо от этого не нужно явно определять, поскольку идентификаторы автоматически глобально доступны, как было указано в другом ответе кем-то более умным, чем я

froggomad 30.12.2018 17:20
Ответ принят как подходящий

Это выполняет свою работу, как я уже сказал в комментариях, использование `` innerHtml '' может быть плохой идеей, если вам Только требуется текстовое содержимое соответствующего элемента HTML. Если вам нужны и вложенные теги, тогда конечно, это не должно быть проблемой, просто будьте осторожны, какой из них вы используете, бывают случаи, когда вы будет хотите, чтобы вложенные HTML-элементы возвращались как часть строки, в других случаях вы не будет и т. д.

const textArr = ["a", "b", "c"];
const el = document.getElementById("main1");
const getIndex = () => textArr.indexOf(el.textContent);

console.info(getIndex());
<p id = "main1">b</p>

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

froggomad 30.12.2018 17:24

@froggomad Добро пожаловать! :) .. Я действительно помню, когда учился, когда я некоторое время был немного неуверен, как получить текст без HTML-тегов, оказалось, что это было действительно так просто, ха-ха.

JO3-W3B-D3V 30.12.2018 17:25

Другие вопросы по теме