【问题标题】:Formatting text with tabs or spaces使用制表符或空格格式化文本
【发布时间】:2013-06-20 21:29:35
【问题描述】:

我有这样的对象:

{
 Name: "John"
 Location: "Unknown"
 Type: "Unknown"
 Status: "Unknown"
 Phone_number: "Unknown"
}

需要这样格式化(使用制表符或空格):

Name:           John // three tabs
Location:       Unknown // two tabs
Type:           Unknown // three tabs
Status:         Unknown // three tabs
Phone_number:   Unknown // one tab

Java 和 Perl 都有这个 functionality in printf,但是如何在 javascript 中做到这一点?

【问题讨论】:

    标签: javascript jquery text-formatting


    【解决方案1】:

    好的。找到here

    /**
     * object.padding(number, string)
     * Transform the string object to string of the actual width filling by the padding character (by default ' ')
     * Negative value of width means left padding, and positive value means right one
     *
     * @param       number  Width of string
     * @param       string  Padding chacracter (by default, ' ')
     * @return      string
     * @access      public
     */
    String.prototype.padding = function(n, c)
    {
            var val = this.valueOf();
            if ( Math.abs(n) <= val.length ) {
                    return val;
            }
            var m = Math.max((Math.abs(n) - this.length) || 0, 0);
            var pad = Array(m + 1).join(String(c || ' ').charAt(0));
    //      var pad = String(c || ' ').charAt(0).repeat(Math.abs(n) - this.length);
            return (n < 0) ? pad + val : val + pad;
    //      return (n < 0) ? val + pad : pad + val;
    };
    

    这不适用于制表符,但与我所描述的空格完全一样。

    我的示例代码是:

    $.each(myObj, function(myKey, myVal) {
    
       myOut += myKey.padding(20) + " = " + myVal + "\r\n";
    
    });
    

    输出将是:

    Name                 = John
    Location             = Unknown
    Type                 = Unknown
    Status               = Unknown
    Phone_number         = Unknown
    

    【讨论】:

    • 这非常有用,但它不适用于一行中的多个填充。
    【解决方案2】:

    编辑您可以使用“\t”添加更多选项卡。每个'\t'表示一个tab,所以在console.log中可以使用更多的console.log(prop + ":\t\t\t" + obj[prop]);

    将您的对象传递给此函数(这适用于任何对象):

    function printObject(obj)
      for(var prop in obj){
       if (obj.hasOwnProperty(prop)) {
        console.log(prop + ":\t" + obj[prop]);
       }
     }
    

    您还可以使用

    获得非常相似的输出(但带有引号)
    JSON.stringify(obj, null, 2); 
    

    这基本上会以 jason 格式打印您的对象,并将使用最后一个参数(2)作为分隔符空格的数量。

    【讨论】:

    • 第一个函数只添加一个选项卡,如果键有长字或几个字,一个选项卡就不够了。即使在我的示例中,第一行也需要两个选项卡。
    • @ancap 你有没有尝试添加更多标签,比如:\t\t,甚至:\t\t\t
    • 我编辑了第一篇文章。正如您在第一行中看到的 - 三个选项卡,第二个 - 两个,第三和第四个 - 三个,第五个 - 一个。
    【解决方案3】:

    String.prototype.padEnd(targetLength, padString) 方法可以完成这项工作,它记录在 here。 如果省略,padString 参数将设置为单空格字符串。

    例子:

    console.log(`   ${'Player'.padEnd(19)} ` +
        `${'MATCH'.padEnd(8) } ` +
        `${'SCORE'.padEnd(8) } `
    );
    for (const player of this.players) {
        console.log(` - ${player.name.padEnd(20)} ` +
            `${player.matches.length.toString().padEnd(8) } ` +
            `${player.score.toString().padEnd(8) } `
        );
    }
    

    结果:

       Player              MATCH    SCORE   
     - Bradly               5        15      
     - Sam                  4        9       
     - Dew                  3        5     
    

    【讨论】:

    • 更干净的例子jsbin.com
    • 将 myString.padEnd(x) 与等宽字体结合使用是最好的解决方案,应该是公认的答案。
    猜你喜欢
    • 2020-08-02
    • 1970-01-01
    • 2018-12-17
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多