我刚刚实现了(在coffeescript中)这些javascript原型(prototype)方法,但我感觉有更好的方法来实现它们
String::after = (value )-> if (@.indexOf( value) == -1 or @.indexOf( value) + value.size() > @.size()) then '' else @.substring(@.indexOf( value) + value.size())
String::after_Last = (value )-> if (@.lastIndexOf(value) == -1 or @.lastIndexOf(value) + value.size() > @.size()) then '' else @.substring(@.lastIndexOf(value) + value.size())
String::before = (value )-> @.substring(0,@.indexOf(value))
String::before_Last = (value )-> @.substring(0,@.lastIndexOf(value))
以下是我当前对这些方法进行的测试:
it 'after',->
value.after.assert_Is_Function()
value.after('3' ).assert_Is('' )
value.after('2' ).assert_Is('3' )
value.after('123').assert_Is('' )
value.after('b' ).assert_Is('c123' )
value.after('bc1').assert_Is('23' )
value.after('xxx').assert_Is('' )
value.after(null ).assert_Is('' )
'abb'.after('b' ).assert_Is('b' )
'a.b'.after('.' ).assert_Is('b' )
'a.b.c'.after('.').assert_Is('b.c' )
it 'after_Last',->
value.after_Last.assert_Is_Function()
value.after_Last('3' ).assert_Is('' )
value.after_Last('2' ).assert_Is('3' )
value.after_Last('123').assert_Is('' )
value.after_Last('b' ).assert_Is('c123' )
value.after_Last('bc1').assert_Is('23' )
value.after_Last('xxx').assert_Is('' )
value.after_Last(null ).assert_Is('' )
'abb'.after_Last('b' ).assert_Is('' )
'a.b'.after_Last('.' ).assert_Is('b' )
'a.b.c'.after_Last('.').assert_Is('c' )
it 'before',->
value.before.assert_Is_Function()
value.before('3' ).assert_Is('abc12')
value.before('2' ).assert_Is('abc1' )
value.before('123').assert_Is('abc' )
value.before('b' ).assert_Is('a' )
value.before('bc1').assert_Is('a' )
value.before('xxx').assert_Is('' )
value.before(null ).assert_Is('' )
'abb'.before('b' ).assert_Is('a' )
'a.b'.before('.' ).assert_Is('a' )
'a.b.c'.before('.').assert_Is('a' )
it 'before_Last',->
value.before_Last.assert_Is_Function()
value.before_Last('3' ).assert_Is('abc12')
value.before_Last('2' ).assert_Is('abc1' )
value.before_Last('123').assert_Is('abc' )
value.before_Last('b' ).assert_Is('a' )
value.before_Last('bc1').assert_Is('a' )
value.before_Last('xxx').assert_Is('' )
value.before_Last(null ).assert_Is('' )
'abb'.before_Last('b' ).assert_Is('ab' )
'a.b'.before_Last('.' ).assert_Is('a' )
'a.b.c'.before_Last('.').assert_Is('a.b' )
我特别不喜欢 after 和 after_Last 方法中的 if 语句
我还想知道我是否缺少 before 和 before_Last 方法的几个测试用例(因为它们是非常简单的实现:))
这些方法是 https://github.com/o2platform/fluentnode 的一部分
更新 1:这里使用的是 Patrick J. S. 的版本
String::after = (value )-> if ((index = @.indexOf( value)) == -1 ) then '' else @.substr(index + value.size())
String::after_Last = (value )-> if ((index = @.lastIndexOf(value)) == -1 ) then '' else @.substr(index + value.size())
我还为 '' 案例添加了这些额外的测试:
value.after_Last ('' ).assert_Is('' )
value.after('' ).assert_Is('abc123')
value.before('' ).assert_Is('' )
value.before_Last('' ).assert_Is('abc123')
最佳答案
您总是需要某种大小写区分,因为 indexOf
的 -1
返回值相当不可用。然而,通过一点魔法,您可以绕过 if 语句:
String::after = (value) -> @slice ~( ~@indexOf(value) || ~@length) + value.length
String::afterLast = (value) -> @slice ~(~@lastIndexOf(value) || ~@length) + value.length
String::before = (value) -> @slice 0, ~( ~@indexOf(value) || ~0)
String::beforeLast = (value) -> @slice 0, ~(~@lastIndexOf(value) || ~0)
关于javascript - 更好的方法来实现(在 javascript 中)after、after_Last、before 和 before_Last 字符串原型(prototype)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27291990/