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
CodePudding user response:
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'));
CodePudding user response:
One simple way of doing this:
export const getFormatValue = (raw, value) => {
raw = raw.split('');
return value.replace(/[^\s]/g, () => {
return raw.shift() || '';
});
}