【问题标题】:StringBuffer equivalent in typescript打字稿中的 StringBuffer 等效项
【发布时间】:2016-06-29 15:14:15
【问题描述】:

我正在尝试将 Dart 管道转换为打字稿,但打字稿中似乎没有 StringBuffer 的等价物。 Dart 代码如下所示

.dart

@Pipe( name: 'titleCase' )
class TitleCasePipe extends PipeTransform {
  dynamic transform( String value, List args ) {
    StringBuffer buffer = new StringBuffer( );

    if ( !isNull( value ) ) {
      List<String> list = value.split( '' );

      if ( value.startsWith( new RegExp( r"^[is]{1,2}([A-Z]|[0-9])" ) ) ) {
        int start = 2;
        List<String> sublist = list.sublist( start );
        return sublist.join( '' );
      }

      for ( int i = 0; i < list.length; i++ ) {
        if ( i == 0 ) {
          buffer.write( list[i].toUpperCase( ) );
          continue;
        }

        if ( isUppercase( list[i] ) ) {
          buffer.write( ' ' );
          buffer.write( list[i] );
          continue;
        }

        buffer.write( list[i] );
      }
    }
    return buffer.toString( );
  }
}

什么是字符串缓冲区的最佳替代品,或者如何最好地使用打字稿转换管道。

谢谢

【问题讨论】:

    标签: angular angular2-forms typescript1.8


    【解决方案1】:

    我会使用数组

    @Pipe({ name: 'titleCase'})
    class TitleCasePipe extends PipeTransform {
      transform(value:string, args:any[] ):any {
        buffer:string[] = [];
    
        if ( !isNull( value ) ) {
          list:string[] = value.split( '' );
    
    
          if ( value.match(/^[is]{1,2}([A-Z]|[0-9]).*/ ) ) {
            start:number = 2;
            sublist:string[] = list.slice( start );
            return sublist.join( '' );
          }
    
          for (i = 0; i < list.length; i++ ) {
            if ( i == 0 ) {
              buffer.push( list[i].toUpperCase( ) );
              continue;
            }
    
            if ( isUppercase( list[i] ) ) {
              buffer.push( ' ' );
              buffer.push( list[i] );
              continue;
            }
    
            buffer.push( list[i] );
          }
        }
        return buffer.join('');
      }
    }
    

    (注意 - 未测试)

    【讨论】:

    • 谢谢。不完全是打字稿,但原则上答案是正确的。我在哪里可以找到 TypeScript API 文档?
    • 您介意在我遗漏的地方修正我的答案吗?
    • 虽然您将 BufferString 更改为 buffer[],但我在 TypeScript 中找不到 isUppercase。 TypeScript Pipe 类不扩展 PipeTransfrom - 只是那些东西。我现在正在自己做移植。
    • 感谢您的反馈。我不做太多的TS,只是回答SO问题。
    【解决方案2】:

    TypeScript(和 JavaScript)中的字符串是可变和可迭代的。

    var foo = "How Brown Cow";
    > undefined
    foo[2]
    > "w"
    

    在字符串不可变的其他语言中,您需要特殊的 StringBuffer 或 StringBuilder 类型来进行连接或操作。使用 TypeScript,您可以使用简单的字符串类型来做到这一点。

    也就是说,看起来您的 titleCase 管道可以使用简单的正则表达式而不是命令式代码来实现。

    How to convert "camelCase" to "Camel Case"?

    @Pipe('titleCase')
    export class TitleCase implements PipeTransform {
      transform(value: string | null) {
        if (!value) return;
    
        return value
          .replace(/([A-Z])/g, ' $1')
          .replace(/^./, s => s.toUpperCase());
      }
    }
    

    需要注意的是,Angular 提供了一个 titleCase 管道。

    【讨论】:

    • JavaScript 中的字符串是不可变的,该代码不会改变变量 foo
    • 从未说过foo 是可变的。我说的是字符串是可变的。在 JavaScript/TypeScript 中,您不需要 StringBuffer、StringBuilder 或特殊的可变类型来修改字符串,如 Dart 示例所示。你可以这样做,`let buffer = "";,然后修改它。从 Dart 复制这个字符串操作并不是最好的解决方案。使用 Regexp 是一种更好的方法。
    • 这不是真的。字符串在 JavaScript 中是不可变的,有关更多详细信息,请参阅此 SO 问题。 stackoverflow.com/questions/51185/… 你所描述的是重新分配一个变量。
    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多