Home > front end >  Replace element in Array from condition in another array
Replace element in Array from condition in another array

Time:10-27

I'm using Javascript to replace elements in an array from a condition in another array. I also need the final output to have the "" removed from any element which is replaced.

I have an array, tagArray which generates parts of speech for a given sentence theSentenceToCheck and it looks like this.

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

I was able to write something that works and generates the desired output but its kinda redundant and total spaghetti. I've looked at similar questions and tried other approaches using filter, map without success, especially on how to use those approaches and remove the "" for replaced elements.

This is my approach

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;

}

This gives me the desired output "The",xtargetx,xtargetx,"is","in","the",xtargetx,xtargetx,"in","a",xtargetx,xtargetx

I was wondering what would be a more elegant solution or pointers on which other JS functions to look into.

CodePudding user response:

A more idiomatically correct way to do this leveraging array methods might be like this.

  • Array.split(" ") splits a sentance into words
  • Array.filter(word => word.length) removes any value whose length is zero
  • Array.map((word, index) => {...}) iterates over the array and allows you to keep track of the current index value
  • Array.includes(element) simply tests that the array includes the value
  • Array.join(' ') does the opposite of 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 => word.length);

const replaceTokens = ["ADJ", "NOUN"];

const replacementWord = "XXX";

const maskedSentance = sentanceToCheck.map((word, index) => {
  const thisTag = tagArray[index];
  
  if ( replaceTokens.includes(thisTag) ) {
    return replacementWord;
  } else {
    return word;
  }
  
}).join(' ');

console.log( maskedSentance );
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>

  • Related