Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ASCII表格,其中字段可以有换行符_Javascript_Arrays_Ascii Art - Fatal编程技术网

Javascript ASCII表格,其中字段可以有换行符

Javascript ASCII表格,其中字段可以有换行符,javascript,arrays,ascii-art,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) {

我有以下显示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;
            }
        }
我应该改变我的函数以产生如下结果:

  array = array.reduce(function (carry, originalRow) {
    var commentLines = originalRow[4].split(/\n/g);

    var rows = commentLines.map(function (commentLine, rowIndex) {
        var newRow = originalRow.map(function (originalCellContent, columnIndex) {
            var cellContent = '';

            if (rowIndex === 0) {
                cellContent = originalCellContent;
            }
            if (columnIndex === 4) {
                cellContent = commentLine;
            }

            return cellContent;
        });
        carry.push(newRow);
    });

    return carry;
  }, []);
+---------------------+--------+-------+-----+----------+------------+---------------------+
|日期|尼克|电子邮件| www |评论| ip |化身|
+---------------------+--------+-------+-----+----------+------------+---------------------+
|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;
    }
}

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

这可以通过扩展
数组来完成,即为注释的每一行添加新行。第一行将与前面相同——只是注释单元格仅包含注释的第一行。每一行都将包含空单元格——注释单元格除外,注释单元格将包含该注释行

为了可读性,我将对大多数函数进行分解,但为了保持您的编码风格,它可能如下所示:

  array = array.reduce(function (carry, originalRow) {
    var commentLines = originalRow[4].split(/\n/g);

    var rows = commentLines.map(function (commentLine, rowIndex) {
        var newRow = originalRow.map(function (originalCellContent, columnIndex) {
            var cellContent = '';

            if (rowIndex === 0) {
                cellContent = originalCellContent;
            }
            if (columnIndex === 4) {
                cellContent = commentLine;
            }

            return cellContent;
        });
        carry.push(newRow);
    });

    return carry;
  }, []);
一把小提琴的叉子,加上这个代码。

在这里:


提示:在每一行查找单元格中的最大行数(CR);然后在每个单元格中添加不足数量的CRs(字符串表示法)。能否使用堆栈片段或JSFIDLE提供一个最小的工作示例?@LGSon小提琴是不是只有
注释可以有新的行字符?@LGSon在这种情况下是的,但我更喜欢更通用的解决方案。很好的解决方案。不过,多个列中的新行仍将打破表格。
    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, r) {
            // let's split the table cells to lines
            var cols = row.map(function(item, i){
              return item.split("\n")
            });
            // and calculate the max column-height in this row
            var maxH = (cols.reduce(function(i,j){return i.length > j.length ? i : j})).length;

            // here we manually build the string that will represent
            // this row of the table, including the "multi-line" cells
            var rowStr = "";
            // loop until the maximum cell height in this row
            for (h=0;h<maxH;h++) {
              rowStr += "| ";
              // loop on all the cells
              for (c=0;c<cols.length;c++) {
                if (c>0) rowStr += " | ";
                // item is the h'th in column c, but it might
                // be non existing, then we use ""
                var item = cols[c][h] || "";
                var size = item.length;
                // here we use the same padding
                if (size < lengths[c]) {
                  item += new Array(lengths[c]-size+1).join(' ');
                }
                rowStr += item;
              }
              rowStr += " |";
              if (h<maxH-1) rowStr += "\n";
            }
          return rowStr;
        });
        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@lol.fr |     | nocomment             | 1844311719 | avatars/default.png |
|                     |      |            |     | lol                   |            |                     |
|                     |      |            |     | lol                   |            |                     |
|                     |      |            |     | lol                   |            |                     |
| 2016-01-10 15:13:59 | ehs  | what       |     | ente rm comment.      | 1423172924 | avatars/default.png |
+---------------------+------+------------+-----+-----------------------+------------+---------------------+