Замените элемент в массиве из условия в другом массиве

#javascript #arrays #replace

Вопрос:

Я использую Javascript для замены элементов в массиве из условия в другом массиве. Мне также нужен окончательный вывод, чтобы «» было удалено из любого заменяемого элемента.

У меня есть массив, tagArray который генерирует части речи для данного предложения theSentenceToCheck , и он выглядит так.

tagArray DET,ADJ,NOUN,VERB,ADP,DET,ADJ, NOUN ,ADP,DET,ADJ,NOUN

theSentenceToCheck The red book is in the brown shelf in a red house

Я смог написать что-то, что работает и генерирует желаемый результат, но это своего рода избыточное и полное спагетти. Я рассматривал аналогичные вопросы и пробовал другие подходы с использованием фильтра, но безуспешно, особенно о том, как использовать эти подходы и удалить «» для замененных элементов.

Это мой подход

 var grammarPart1 = "NOUN"; var grammarPart2 = "ADJ"; var posToReplace = 0;  function assignTargetToFillIn(){  var theSentenceToCheckArrayed = theSentenceToCheck.split(" ");  var results = [];  var idx = tagArray.indexOf(grammarPart1);  var idx2 = tagArray.indexOf(grammarPart2);  while (idx != -1 || idx2 != -1) {  results.push(idx);  results.push(idx2)  idx = tagArray.indexOf(grammarPart1, idx   1);  idx2 = tagArray.indexOf(grammarPart2, idx2   1);  posToReplace = results;   } const iterator = posToReplace.values(); for (const value of iterator) {  theSentenceToCheckArrayed[value] ="xtargetx";  }  var addDoubleQuotesToElements = """   theSentenceToCheckArrayed.join("","")   """;  var addDoubleQuotesToElementsArray = addDoubleQuotesToElements.split(","); /**This is where I remove the "" from element replaced with xtargetx*/  const iterator2 = posToReplace.values();  for (const value of iterator2) {  addDoubleQuotesToElementsArray[value] ="xtargetx";  console.log(value);  }   return results;  

}

Это дает мне желаемый результат "The",xtargetx,xtargetx,"is","in","the",xtargetx,xtargetx,"in","a",xtargetx,xtargetx

Мне было интересно, что было бы более элегантным решением или указателями на то, какие другие функции JS следует изучить.

Ответ №1:

Более идиоматически правильный способ сделать это, используя методы массива, может быть таким.

  • Array.split(" ") разбивает послание на слова
  • Array.filter(word =gt; word.length) удаляет любое значение, длина которого равна нулю
  • Array.map((word, index) =gt; {...}) выполняет итерацию по массиву и позволяет отслеживать текущее значение индекса
  • Array.includes(element) просто проверяет, что массив содержит значение
  • Array.join(' ') делает противоположное Array.split(' ')
 const tagArray = ["DET", "ADJ", "NOUN", "VERB", "ADP", "DET", "ADJ", "NOUN", "ADP", "DET", "ADJ", "NOUN"];  // Split on spaces and remove any zero-length element (produced by two spaces in a row)  const sentanceToCheck = "The red book is in the brown shelf in a red house".split(" ").filter(word =gt; word.length);  const replaceTokens = ["ADJ", "NOUN"];  const replacementWord = "XXX";  const maskedSentance = sentanceToCheck.map((word, index) =gt; {  const thisTag = tagArray[index];    if ( replaceTokens.includes(thisTag) ) {  return replacementWord;  } else {  return word;  }   }).join(' ');  console.log( maskedSentance ); 

Комментарии:

1. Именно то, что я искал. Спасибо вам за помощь и подробный ответ/объяснение!