I have multiple arrays that look more or less like so :
let r = [
'Upon causing an Overloaded, Melt, Burning, Vaporize, or a Pyro-infused Swirl reaction, increases Base ATK by 20% for 12s.',
'Upon causing an Overloaded, Melt, Burning, Vaporize, or a Pyro-infused Swirl reaction, increases Base ATK by 25% for 12s.',
'Upon causing an Overloaded, Melt, Burning, Vaporize, or a Pyro-infused Swirl reaction, increases Base ATK by 30% for 12s.',
'Upon causing an Overloaded, Melt, Burning, Vaporize, or a Pyro-infused Swirl reaction, increases Base ATK by 35% for 12s.',
'Upon causing an Overloaded, Melt, Burning, Vaporize, or a Pyro-infused Swirl reaction, increases Base ATK by 40% for 12s.'
]
let r1 = [
'Increases Movement SPD by 10%. When in battle, gain an 8% Elemental DMG Bonus every 4s. Max 4 stacks. Lasts until the character falls or leaves combat.',
'Increases Movement SPD by 10%. When in battle, earn an 8% Elemental DMG Bonus every 4s. Max 4 stacks. Lasts until the character falls or leaves combat.',
'Increases Movement SPD by 10%. When in battle, earn a 10% Elemental DMG Bonus every 4s. Max 4 stacks. Lasts until the character falls or leaves combat.',
'Increases Movement SPD by 10%. When in battle, earn a 12% Elemental DMG Bonus every 4s. Max 4 stacks. Lasts until the character falls or leaves combat.',
'Increases Movement SPD by 10%. When in battle, earn a 14% Elemental DMG Bonus every 4s. Max 4 stacks. Lasts until the character falls or leaves combat.'
]
The problem is that I want other elements in the array (not including the first one) to only include the word different compared to the others.
// <number>% //
In clear, I want that all the next lines will have everything replaced with //
except the words that change. In the end I would like a result like so :
[
'Upon causing an Overloaded, Melt, Burning, Vaporize, or a Pyro-infused Swirl reaction, increases Base ATK by 20% for 12s.',
'// 20% //',
'// 30% //',
'// 35% //',
'// 40% //'
]
I have absolutely no idea on how to accomplish this and I would like help on creating a function so when I give an array like that as input, the result above get returned.
CodePudding user response:
You can try the following function:
function replaceStatic(array, replacement) {
let currSentence = array[0]; // First comparison sentence
let splittedCurrSentence = currSentence.split(" "); // Get currSentence words in an array (for further comparison)
const newArray = [currSentence]; // The array to return. First sentence can already be in there
for (let s = 1, len = array.length; s < len; s ) { // Loop from second to last sentence
const sentence = array[s]; // Current sentence to analyse
const splittedSentence = sentence.split(" "); // Words array for the sentence to analyze
let replace = true; // Set a boolean to handle when you need to replace the current word
const mappedSplittedSentence = splittedSentence.map(word => {
// Maps every words with itself (if new), the replacement string (if not new a last word was new) or doesn't map
if (!splittedCurrSentence.includes(word)) {
replace = true;
return word;
} else if (replace) {
replace = false; // Set to false so if next word is also new, there won't be consecutive replacements
return replacement;
}
}).filter(word => word !== undefined); // Remove unmapped words (consecutive already existing words)
newArray.push(mappedSplittedSentence.join(" ")); // Stringify the mapped sentence
// Set comparison sentence to the current sentence for next iteration
// This is done so every check is made compared to previous sentence
// You can comment/remove this if you only want to compare to the first sentence
splittedCurrSentence = splittedSentence;
}
return newArray;
}
If you call your r array it returns:
console.log( replaceStatic(r, "//") );
/*
Output:
[
'Upon causing an Overloaded, Melt, Burning, Vaporize, or a Pyro-infused Swirl reaction, increases Base ATK by 20% for 12s.',
'// 25% //',
'// 30% //',
'// 35% //',
'// 40% //'
]
*/
With r1 it gives:
console.log( replaceStatic(r1, "//") );
/*
Output:
[
'Increases Movement SPD by 10%. When in battle, gain an 8% Elemental DMG Bonus every 4s. Max 4 stacks. Lasts until the character falls or leaves combat.',
'// earn //',
'// a 10% //',
'// 12% //',
'// 14% //'
]
*/
There are probably better solutions but this should be general enough to fit your case.
CodePudding user response:
I would start with a "template string" (just a name, not realted template literals) that has a specific phrase to be replaced, and an array of the values to replace it with, then map the replacement values with the template string.
const templateString = "Upon causing an Overloaded, Melt, Burning, Vaporize, or a Pyro-infused Swirl reaction, increases Base ATK by **percent**% for 12s.";
const percentages = [20,25,30,40];
const replacedStrings = percentages.map(
function(p) {
return templateString.replace("**percent**",p);
}
);
console.log("replacedStrings",replacedStrings);
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>