Форматирование строки в вложенном массиве

Нужно реализовать форматирование для вложенного массива ,нужно проверить каждый массив, если во вложенном массиве символов больше чем 16,то нужно разделить этот массив и перенести на новую строку прижав к правой стороне(как на картинке 2 и 3 строка). В целом я попытался реализовать ,но у меня не получается...HELP Я поделил строку ,но не верно и не могу добавить звездочки...

const textArray = [
  ["Hello", "world"],
  ["Brad", "came", "to", "dinner", "with", "us"],
  ["He", "loves", "tacos"]
];

const stringLengthLimit = 16;

const textArrayFlated = textArray.flat();

const strings = [];

let processed = '';

textArrayFlated.map((word) => {
 
 const chunkedString = processed.concat(' ' + word).trim();
 if (chunkedString.length < 10) {
   processed = chunkedString;
 } else {
   processed = '';
   strings.push(chunkedString);
 }
 
});

console.log(strings);

Вот картинка финального результата как должно быть введите сюда описание изображения


Ответы (2 шт):

Автор решения: Igor

const textArray = [
  ["Hello", "world"],
  ["Brad", "came", "to", "dinner", "with", "us"],
  ["He", "loves", "tacos"]
];

const stringLengthLimit = 16;

const a = [];
a.push('*'.repeat(stringLengthLimit + 2));
textArray.forEach(s => {
  const l = s.join(' ').length;
  if (l <= stringLengthLimit) {
    a.push('*' + s.join(' ') + ' '.repeat(stringLengthLimit - l) + '*');
  } else {
    const r = s.reduce((r, i) => {
      if ((r + i).length > stringLengthLimit) {
        a.push('*' + ' '.repeat(stringLengthLimit - r.length) + r + '*');
        return i;
      } else {
        return r + ' ' + i;
      }
    }, '');
    a.push('*' + ' '.repeat(stringLengthLimit - r.length) + r + '*');
  }
});
a.push('*'.repeat(stringLengthLimit + 2));

console.log(a);

→ Ссылка
Автор решения: vsemozhebuty

По-моему, вы зря начали с уплощения массива, так у вас все фразы слепились в одну большую.

Как вариант:

const phrases = [
  ['Hello', 'world'],
  ['Brad', 'came', 'to', 'dinner', 'with', 'us'],
  ['He', 'loves', 'tacos']
];

const limit = 16;
const border = '*'.repeat(limit + 2);

const output = [border];

phrases.forEach((phrase, i) => {
  phrase = phrase.join(' ');

  if (phrase.length <= limit) {
    output.push(`*${phrase.padEnd(16)}*`);
  } else {
    const lines = phrase
      .replace(/(.{1,16}) /, '$1\n')
      .split('\n')
      .map(line => `*${line.padStart(16)}*`);
    output.push(...lines);
  }
});

output.push(border);

console.log(output);

→ Ссылка