#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. Именно то, что я искал. Спасибо вам за помощь и подробный ответ/объяснение!