несколько вариантов в indexOf

186
02 января 2022, 11:20

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

найти в тексте который вводят в input слово и если оно есть, подгрузить html из файла в elementID на страницу.

Таких запросов около 10, каждый выводит разные файлы

var text = "разный всякий текст где есть слово которое надо определить" 
if (text.toUpperCase().indexOf("слово".toUpperCase()) != -1) { 
  fetch('pageurl.html') 
    .then(data => data.text()) 
    .then(html => document.getElementById('elementID').innerHTML = html); 
}
<div id='elementID'> </div>

Все работает, но никак не получается в indexOf() указать несколько вариантов которые нужно проверить. Что-то типа .indexOf("слово" или "слово" или "слово".toUpperCase())

Answer 1

как это сделать

можно так:

сработает, если все слова будут найдены

если есть необходимость делать какое-то действие на 1 совпадение, то counter можно убрать, после if сразу делать return true;, а после цикла return: false;

function checker(text, words) { 
  let counter = 0; 
 
  for (let i = 0; i < words.length; i++) { 
    if (text.includes(words[i])) 
      counter++; 
  } 
 
  return counter === words.length ? true : false; 
} 
 
function init() { 
  const text = 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Ullam, minus!'; 
  const words = ['amet', 'minus!']; 
 
  if (checker(text, words)) 
    console.log('do something...'); 
} 
 
init();

UPD. если любое совпадение

function checker(text, words) { 
  for (let i = 0; i < words.length; i++) { 
    if (text.includes(words[i])) 
      return true; 
  } 
 
  return false; 
} 
 
function init() { 
  const text = 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Ullam, minus!'; 
  const words = ['foo', 'baz', 'dolor']; 
 
  if (checker(text, words)) 
    console.log('do something...'); 
} 
 
init();

Answer 2
var words = new Set(["слово", "другое", "ещё", "и", "ёж"])
// ...
for (var x of text.toLowerCase().split(/[^a-zа-яё]/i)) {
  if (words.has(x)) {
    // ...
    break;
  }
}
Answer 3

let text = 'разный всякий текст где есть слово которое надо определить';  
const words = new Set(text.split(/\s+/).map(w => w.toLowerCase()));  
const result = ['текст', 'есть', 'сепульки'].map( 
  word => ({ [word]: words.has(word) })  
);  
const allWordsIncluded = result.every(rslt => Object.values(rslt)[0]);  
console.log(result);  
console.log('все ли слова есть в тексте: ' + allWordsIncluded); 

В общем виде, можно все реализовать примерно так:

const foo = (text, outputElem, rules) => { 
  const words = new Set(text.split(/\s+/).map(w => w.toLowerCase())); 
  const fetches = rules
    .filter(rule => words.has(rule.word))
    .map(rule => fetch(rule.file).then(response => response.text()); 
  Promises.all(fetches).then(html => outputElem.innerHTML = html.join('\n')); 
}; 
const rules = [
  { word: 'текст', file: 'one.html' }, 
  { word: 'есть', file: 'two.html' }, 
  { word: 'слово', file: 'three.html' }, 
]; 
const input = document.querySelector('#input'), 
      output = document.querySelector('#output'); 
input.addEventListener('change', e => foo(e.target.value, output, rules)); 

, но сомневаюсь что разметка полных документов (с доктайпом, <head>, и т.д.) будет корректно отображаться в элементе...

READ ALSO
SyntaxError vue js [закрыт]

SyntaxError vue js [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

178
Помогите правильно разместить блок

Помогите правильно разместить блок

Помогите разместить блок(content) под меню, а то я голову уже сломалИ все ни как не получается

93
Максимальный элемент кратный 4

Максимальный элемент кратный 4

Всем приветВ IDEA проходит, но при проверке решения - ошибка

135
Защита от ввода множества строк

Защита от ввода множества строк

Пользователь с клавиатуры вводит некую информацию, если она не соответствует заранее заданным критериям, то выводится сообщение об ошибкеПри...

193