驼峰式到烤肉串式

新手上路,请多包涵

我有一个 kebabize 函数,可以将 camelCase 转换为 kebab-case。我正在分享我的代码。可以更优化吗?我知道这个问题可以使用正则表达式来解决。但是,我想在不使用正则表达式的情况下做到这一点。

 const kebabize = str => {

    let subs = []
    let char = ''
    let j = 0

    for( let i = 0; i < str.length; i++ ) {

        char = str[i]

        if(str[i] === char.toUpperCase()) {
            subs.push(str.slice(j, i))
            j = i
        }

        if(i == str.length - 1) {
            subs.push(str.slice(j, str.length))
        }
    }

    return subs.map(el => (el.charAt(0).toLowerCase() + el.substr(1, el.length))).join('-')
}

kebabize('myNameIsStack')

原文由 Stack 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 406
2 个回答
 const kebabize = str => {
   return str.split('').map((letter, idx) => {
     return letter.toUpperCase() === letter
      ? `${idx !== 0 ? '-' : ''}${letter.toLowerCase()}`
      : letter;
   }).join('');
}

console.log(kebabize('myNameIsStack'));
console.log(kebabize('MyNameIsStack'));

您可以检查每个字母是否为大写并替换它。

原文由 Nicolae Maties 发布,翻译遵循 CC BY-SA 4.0 许可协议

我有一个类似于 Marc 的单行代码,但有一个更简单的正则表达式,并且根据我的基准测试(Chrome 89)快了约 20%。

 const kebabize = (str) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? "-" : "") + $.toLowerCase())

const words = ['StackOverflow', 'camelCase', 'alllowercase', 'ALLCAPITALLETTERS', 'CustomXMLParser', 'APIFinder', 'JSONResponseData', 'Person20Address', 'UserAPI20Endpoint'];

console.log(words.map(kebabize));

[A-Z]+(?![a-z]) 匹配任何连续的大写字母,不包括任何大写字母后跟小写字母(表示下一个单词)。添加 |[A-Z] 然后包括任何单个大写字母。它 必须 在连续的大写表达式之后,否则表达式将单独匹配所有大写字母而永远不会匹配连续的。

String.prototype.replace 可以带替换函数。在这里,它返回每个单词的小写匹配大写字母,在匹配偏移量为真(不是零 - 不是字符串的第一个字符)时加上连字符前缀。

我怀疑 Marc 的解决方案的性能不如我的,因为通过使用 replace 插入连字符并随后将整个字符串小写,它必须多次迭代字符串,并且它的表达式也有更复杂的前瞻/后视结构。

基准

原文由 ABabin 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题