javascript - 更好的方法来实现(在 javascript 中)after、after_Last、before 和 before_Last 字符串原型(prototype)方法

标签 javascript coffeescript

我刚刚实现了(在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'  )

我特别不喜欢 afterafter_Last 方法中的 if 语句

我还想知道我是否缺少 beforebefore_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/

相关文章:

javascript - 将参数传入另一个函数

javascript - javascript中如何将多个对象转换为键值对的Array[]

javascript - jQuery 在多个嵌套字段上仅适用于第一个字段

javascript - 如何在维护 DRY 代码的同时运行依赖于 js 事件的 coffeescript 方法?

javascript - 在javascript中访问div的高度

javascript - 使用 (jQuery) 执行函数

javascript - Coffeescript unexpected token ILLEGAL,但不应该有任何非法内容

javascript - 将字符串的所有实例替换为另一个 jquery

javascript - OpenLayers + Rails 3 + CoffeeScript = a.draw 不是函数

javascript - 访问 CSS 高度值(通用方法)?