javascript - ASCII 表,其中字段可以有换行符

标签 javascript arrays ascii-art

我有以下显示ASCII表的函数

        function ascii_table(array, header) {
            if (!array.length) {
                return '';
            }
            var lengths = array[0].map(function(_, i) {
                var col = array.map(function(row) {
                    if (row[i] != undefined) {
                        return row[i].length;
                    } else {
                        return 0;
                    }
                });
                return Math.max.apply(Math, col);
            });
            array = array.map(function(row) {
                return '| ' + row.map(function(item, i) {
                    var size = item.length;
                    if (size < lengths[i]) {
                        item += new Array(lengths[i]-size+1).join(' ');
                    }
                    return item;
                }).join(' | ') + ' |';
            });
            var sep = '+' + lengths.map(function(length) {
                return new Array(length+3).join('-');
            }).join('+') + '+';
            if (header) {
                return sep + '\n' + array[0] + '\n' + sep + '\n' +
                    array.slice(1).join('\n') + '\n' + sep;
            } else {
                return sep + '\n' + array.join('\n') + '\n' + sep;
            }
        }

问题是当单元格包含新行时,我最终得到这样的结果:

+---------------------+--------+-------+-----+-------------------------------+------------+---------------------+
| date                | nick   | email | www | comment                       | ip         | avatar              |
+---------------------+--------+-------+-----+-------------------------------+------------+---------------------+
| 2016-01-27 21:11:10 | stefan | kanev |     | dsfdsfsd
sdfsdf
sdfsdf
sdfdsf | 1308240552 | avatars/default.png |
+---------------------+--------+-------+-----+-------------------------------+------------+---------------------+

我应该在我的函数中更改什么才能产生这样的结果:

+---------------------+--------+-------+-----+----------+------------+---------------------+
| date                | nick   | email | www | comment  | ip         | avatar              |
+---------------------+--------+-------+-----+----------+------------+---------------------+
| 2016-01-27 21:11:10 | stefan | kanev |     | dsfdsfsd | 1308240552 | avatars/default.png |
|                     |        |       |     | sdfsdf   |            |                     |
|                     |        |       |     | sdfsdf   |            |                     |
|                     |        |       |     | sdfdsf   |            |                     |
+---------------------+--------+-------+-----+----------+------------+---------------------+

最佳答案

您可以在渲染之前修改表格并将新行添加到表格中:

function ascii_table(array, header) {
    if (!array.length) {
        return '';
    }

    //added
    for (var i = array.length - 1; i >= 0; i--) {
        var row = array[i];
        var stacks = [];
        for (var j = 0; j < row.length; j++) {
            var newLines = row[j].split("\n");
            row[j] = newLines.shift();
            stacks.push(newLines);
        }
        var newRowsCount = stacks.reduce(function(a, b) {
            return a.length > b.length ? a : b;
        }).length;
        for (var k = newRowsCount - 1; k >= 0; k--) {
            array.splice(i + 1, 0, stacks.map(function(stackColumn) {
                return stackColumn[k] || "";
            }));
        }
    }
    //added

    var lengths = array[0].map(function(_, i) {
        var col = array.map(function(row) {
            if (row[i] != undefined) {
                return row[i].length;
            } else {
                return 0;
            }
        });
        return Math.max.apply(Math, col);
    });
    array = array.map(function(row) {
        return '| ' + row.map(function(item, i) {
            var size = item.length;
            if (size < lengths[i]) {
                item += new Array(lengths[i] - size + 1).join(' ');
            }
            return item;
        }).join(' | ') + ' |';
    });
    var sep = '+' + lengths.map(function(length) {
        return new Array(length + 3).join('-');
    }).join('+') + '+';
    if (header) {
        return sep + '\n' + array[0] + '\n' + sep + '\n' +
            array.slice(1).join('\n') + '\n' + sep;
    } else {
        return sep + '\n' + array.join('\n') + '\n' + sep;
    }
}

输出:

+---------------------+------+--------+-----+------------------+------------+---------------------+
| date                | nick | email  | www | comment          | ip         | avatar              |
+---------------------+------+--------+-----+------------------+------------+---------------------+
| 2016-01-28 11:40:59 | lol  | lol@lo |     | nocomment        | 1844311719 | avatars/default.png |
|                     |      | l.fr   |     | lol              |            |                     |
|                     |      |        |     | lol              |            |                     |
|                     |      |        |     | lol              |            |                     |
| 2016-01-10 15:13:59 | ehs  | what   |     | ente rm comment. | 1423172924 | avatars/default.png |
+---------------------+------+--------+-----+------------------+------------+---------------------+

(在一个电子邮件单元格中添加了新行,以测试多列中的新行)。

关于javascript - ASCII 表,其中字段可以有换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35047522/

相关文章:

javascript - 无法使用 jQuery 从文本编辑器(jQuery 文本编辑器)获取值

algorithm - 最小化随机矩形中的重叠

c++ - 解压 C++ 指针/引用语法

javascript - 根据子数组的位置和数组的第一个元素计算子数组元素的总和

language-agnostic - Code Golf : recognize ascii art boxes

web - 是否有将 ASCII 笑脸转换为 Unicode 表情符号的等效表?

javascript - 如何提醒 var distance_all (来自 var distance_top + distance_bottom)?

javascript - 我的 JavaScript 出现问题

javascript - formData 对象不适用于 jquery AJAX post?

javascript - 如何使用 D3.js 和 .运算符(operator)