Если вы хотите поразить публику умением решить данную задачу в одну строку, писать плохой и неподдерживаемый код, который сложно понять, то пригодится это вариант
[
"*".repeat(18),
...textArray
.map(words => words.join(" "))
.map(line => {
const pad = (line.length > 16)?''.padStart:''.padEnd;
const lines = [];
let restLine = line;
while(restLine.length > 16) {
const spaceIndex = restLine.lastIndexOf(" ", 16);
lines.push(pad.call(restLine.slice(0, spaceIndex), 16));
restLine = restLine.slice(spaceIndex + 1);
}
lines.push(pad.call(restLine, 16));
return lines;
})
.flat()
.map(line => "*" + line + "*"),
"*".repeat(18)
]
Но если вы хотите, чтобы вас поняли и, самое главное, вы поняли, что написали, то лучше делать так:
function formatTextArray(textArray, maxLineLength = 16) {
const formatedTextArray = [];
textArray
.forEach(words => {
const line = words.join(" ");
if(line.length > maxLineLength) {
splitLine(line)
.forEach(item => formatedTextArray.push(align(item, false)) );
} else {
formatedTextArray.push(align(line));
}
}, []);
return addBorders(formatedTextArray);
function align(line = "", isLeft = true) {
let newLine;
if(isLeft) {
newLine = line.padEnd(maxLineLength);
} else {
newLine = line.padStart(maxLineLength);
}
return newLine;
}
function splitLine(line) {
if(line.length > maxLineLength) {
const spaceIndex = line.lastIndexOf(" ", maxLineLength);
const lineStartPart = line.slice(0, spaceIndex);
const restLine = line.slice(spaceIndex + 1);
return ([lineStartPart]).concat(splitLine(restLine));
} else {
return [line]
}
}
function addBorders(formatedTextArray, symbol = "*") {
const borderedTextArray = [
symbol.repeat(maxLineLength),
...formatedTextArray,
symbol.repeat(maxLineLength)
];
return borderedTextArray.map(addHorizontalBorders);
function addHorizontalBorders(line) {
return symbol + line + symbol;
}
}
}
А вот интерактивный пример
Ну и задачка со звездочкой, найдите где этот код будет работать не корректно