在typescript中等效的StringBuffer

时间:2016-03-14 14:18:14

标签: angular angular2-forms typescript1.8

我正在尝试将Dart管道转换为typescript,但似乎在typescript中没有等效的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( );
  }
}

String缓冲区的最佳替换是什么,或者如何使用typescript转换管道。

由于

2 个答案:

答案 0 :(得分:1)

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

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

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

Javascript camelCase to Regular Form

答案 1 :(得分:0)

我会使用数组

@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('');
  }
}

(谨慎 - 未经测试)