I have the following function:
export const getFormatValue = (raw, value) => {
let maskIndex = 0;
let formattedValue = '';
raw.split('').forEach(char => {
if (value.length > maskIndex && value[maskIndex] === ' ') {
formattedValue += ' ';
maskIndex += 1;
}
formattedValue += char;
maskIndex += 1;
});
return formattedValue;
};
It fails the following test cases
Expected: "A BB CCC"
Received: "A B BC C C"
> 11 | expect(getFormatValue('ABBCCC', 'A AA AAA')).toBe('A BB CCC');
My code works for simple cases such as:
expect(getFormatValue('23', '0 0000 0000 0000')).toBe('2 3');
But soon as the "mask" pattern gets more complicated it fails.
The "mask" value is dynamic
2 Answers 2
You can reverse the string to be formatted, and then you can use the function Array.prototype.reduce and check the char in the pattern.
function getFormatValue(str, pattern) {
const reversed = str.split("").reverse();
return pattern.split("").reduce((a, c) => [...a, c === " " ? c : reversed.pop()], []).join("");
}
console.log(getFormatValue('ABBCCC', 'A AA AAA'));
answered Jun 23, 2022 at 14:29
Ele
33.8k7 gold badges43 silver badges80 bronze badges
Sign up to request clarification or add additional context in comments.
Comments
One simple way of doing this:
export const getFormatValue = (raw, value) => {
raw = raw.split('');
return value.replace(/[^\s]/g, () => {
return raw.shift() || '';
});
}
answered Jun 23, 2022 at 14:30
Ram
145k16 gold badges174 silver badges201 bronze badges
Comments
Explore related questions
See similar questions with these tags.
lang-js