如何在控制台的一行中将两个多行字符串放在一起?

问题描述 投票:0回答:5

我正在尝试使用文本艺术数字制作动态Javascript数字时钟。由于数字是文本艺术,因此它们是多行字符串,并且在登录到控制台时显示在彼此的顶部。示例如下。

let time0 =`
 a8888a  
d8' ..8b 
88 .P 88 
88 d' 88 
Y8'' .8P 
 Y8888P`
let time1 =`
d88  
 88  
 88  
 88  
 88  
d88P`

我希望输出例如是下午12:03:52。在文本艺术中,但它是在这样的另一种类型之上

1
2
:
...
javascript
5个回答
0
投票

您可以将所有字母合并为一个大块:

 function mergeDigits(...digits) {
  const result = [];

  for(const digit of digits) {
   for(const [index, row] of digit.split("\n").entries())
      result[index] = (result[index] || "") + row + " ".repeat(10 - row.length);
  }

  return result.join("\n");
}

console.log(mergeDigits(time0, time1));

0
投票

我的方法是通过qazxs在换行符(split)上将字符串转换为数组,然后一次记录一行:

\n

0
投票

我建议创建一个连接数字的函数,这里有一个例子:

let time0 =`
 a8888a  
d8' ..8b 
88 .P 88 
88 d' 88 
Y8'' .8P 
 Y8888P  `.split('\n')
let time1 =`
d88  
 88  
 88  
 88  
 88  
d88P`.split('\n')


for (let i = 1; i < time0.length; i++) {
  console.log(time0[i] + '  ' + time1[i]);
}

0
投票

我会建议这个功能。它会查找图案的高度,每个图案中每条线的宽度,以确保正确的对齐:

    let time0 =`
     a8888a  
    d8' ..8b 
    88 .P 88 
    88 d' 88 
    Y8'' .8P 
     Y8888P  `;
    let time1 =`
    d88  
     88  
     88  
     88  
     88  
    d88P`;

    function concat(number1, number2) {
       var parts1 = number1.split('\n');
       var parts2 = number2.split('\n');
       var result = [];
       parts1.forEach((line, index)=>{
           var line2 = parts2[index] || '';
           result.push(line + ' ' + line2);
       });
       return result.join('\n');
    }
    var result = concat(time0, time1);
    console.log(result)

0
投票

此版本以字符映射和要在它们之间放置的空格数开始,并返回一个函数,该函数接受一个字符串,将其拆分为字符并从中创建组合的文本艺术字符串。请注意,它并不关心字符是什么。它不会进行任何错误检查以确保所有字符都存在,并且它们的高度相同。这并不难添加。

function joinPatterns(...args) {
    const patterns = args.map(pat => pat.split(/[\n\r]+/));
    const widths = patterns.map(lines => Math.max(...lines.map(line => line.length)));
    const length = Math.max(...patterns.map(lines => lines.length));
    return Array.from({length}, (_, i) =>
        patterns.map((lines, j) => (lines[i]||"").padEnd(widths[j], " ")).join(" ")
    ).join("\n");
}

let time0 =`
 a8888a  
d8' ..8b 
88 .P 88 
88 d' 88 
Y8'' .8P 
 Y8888P`
let time1 =`
d88  
 88  
 88  
 88  
 88  
d88P`

const res = joinPatterns(time0, time1, time0);

console.log(res);

一个非常有趣的变体,如果你只关心数字0 - 9,将首先解析一个更完整的版本:

const formatChars = (chars, spacing) => {
  const cs = Object.entries(chars)
    .map(([k, c]) => [k, c.split('\n')])
    .reduce((a, [k, c]) => ({...a, [k]: c}), {})
  return (str) => 
    ('' + str).split('').map(c => cs[c])
    .reduce((c1, c2) => {
      const width = Math.max(...c1.map(c => c.length)) + spacing
      return c1.map((c, i) => c.padEnd(width, ' ') + c2[i])
    }).join('\n')
}

const chars = {
  '0': `
 a8888a  
d8' ..8b 
88 .P 88 
88 d' 88 
Y8'' .8P 
 Y8888P  `,
  '1': `
d88  
 88  
 88  
 88  
 88  
d88P`
}

console.log(formatChars(chars, 1)('11010'))
console.log(formatChars(chars, 4)('11010'))

推荐问答