Проверка принадлежности символа строки к массиву

227
04 апреля 2018, 10:17

Если "input1" содержит только один символ из "neterminal", тогда в список рядом с правилом указывается тип правила "type1" (например, Z --> abc type1, A --> b type1), если "input2" содержит только один символ "neteminal", тогда это правило типа "type2" (например, A --> abcD type2) (формальные языки и грамматики).

var terminal = ['a', 'b', 'c']; 
var term=document.getElementById('terminal').innerHTML = terminal; 
var neterminal = ['D', 'A', 'Z', 'L']; 
var neterm = document.getElementById('neterminal').innerHTML = neterminal; 
 
var changeStringFromRules = []; 
var changeStringToRules = []; 
function pushRules(list){ 
    var rules = ""; 
    var w1 = document.getElementById('inputw1').value; 
    changeStringFromRules.push(w1); 
    var w2 = document.getElementById('inputw2').value; 
    changeStringToRules.push(w2); 
    var w = w1+'-->'+w2; 
    var li = document.createElement("li"); 
    var rule = document.createTextNode(w); 
    li.appendChild(rule); 
    document.getElementById("list").appendChild(li); 
}
<form> 
        <label>w1:</label><input id="inputw1" type="text"><label> --> w2:</label><input id="inputw2" type="text"> 
        <input type="button" value="Add" onclick="pushRules()"> 
</form> 
<h3>Rules:</h3> 
<div class="container_rules"> 
  <ui id="list"></ui> 
</div>

Answer 1

// Проверка на единственное вхождение в строку str любого элемента массива|строки dict. 
// Возвращает индекс элемента, или false (если вхождений нет, либо больше одного).  
function singleOcrIdx(str, dict, caseSensitive = false) { 
  if (!str.length) 
    return false;  
  if (typeof dict === 'string') 
    dict = dict.split('');  
  if (!(dict instanceof Array) || !dict.length) 
    return false;  
  let flags = caseSensitive ? 'g' : 'gi',  
      idx = -1, 
      count, result;  
  result = !dict.some(function(v, i) { 
    count = (str.match(new RegExp(v + '', flags)) || []).length;  
    return ((count === 1) && (idx < 0)) ? (idx = i, false) : 
      (!count ? false : true);  
  });  
  return (result && (idx > -1)) ? idx : false;  
} 
 
 
// ----------------------------------------------- 
var terminal   = ['a', 'b', 'c'],  
    neterminal = ['D', 'A', 'Z', 'L'],  
    changeStringFromRules = [],  
    changeStringToRules   = [];  
 
document.getElementById('terminal').textContent   = terminal; 
document.getElementById('neterminal').textContent = neterminal; 
 
function pushRules(thisBtn) { 
  let frm = thisBtn.parentElement,  
      w1  = frm.inputw1.value,  
      w2  = frm.inputw2.value, 
      i1  = singleOcrIdx(w1, neterminal, true),  
      i2  = singleOcrIdx(w2, neterminal, true) 
      rt  = (i2 !== false) ? 'type2' : ((i1 !== false) ? 'type1' : '');  
  changeStringFromRules.push(w1); 
  changeStringToRules.push(w2); 
  let li = document.createElement('li'); 
  li.textContent = `${w1} --> ${w2} ${rt}`;  
  document.getElementById('list').appendChild(li);  
}
body, 
input { 
  font: 16px monospace;  
} 
 
input { 
  width: 100px;  
} 
 
#terminal,  
#neterminal { 
  display: inline-block;  
  padding: 4px 8px; 
  margin: 16px 8px; margin-top: 0; 
  border: 1px dashed #ccc;  
}
<span id="terminal"></span> 
<span id="neterminal"></span> 
<form> 
  <label>w1:</label><input name="inputw1" type="text"><label> --> w2:</label><input name="inputw2" type="text"> 
  <input type="button" value="Add" onclick="pushRules(this)"> 
</form> 
<hr> 
<h3>Rules:</h3> 
<div class="container_rules"> 
  <ui id="list"></ui> 
</div>

READ ALSO
Общение несвязанных компонентов Vue

Общение несвязанных компонентов Vue

Доброго дняЕсть таблица где каждая ячейка представленна отдельным компонентом

200
Фон из многоугольников

Фон из многоугольников

Необходимо сделать фон из многоугольников

264
Как отправить данные по почте из формы?

Как отправить данные по почте из формы?

Как отправить данные на почту в вордрессе? По клику на странице выскакивает вот такое окно, после нажатия кнопки "Купить", не отправляет на почту...

188
Сформировать массив из ajax запроса

Сформировать массив из ajax запроса

Как сформировать массив из функции? Получаю данные ajax запросом и вывожу их в виде html:

180