• codewars--js--Convert all the cases!


    问题描述:

    In this kata, you will make a function that converts between camelCasesnake_case, and kebab-case.

    You must write a function that changes to a given case. It must be able to handle all three case types:

    js> changeCase("snakeCase", "snake")
    "snake_case"
    js> changeCase("some-lisp-name", "camel")
    "someLispName"
    js> changeCase("map_to_all", "kebab")
    "map-to-all"
    js> changeCase("doHTMLRequest", "kebab")
    "do-h-t-m-l-request"
    js> changeCase("invalid-inPut_bad", "kebab")
    undefined
    js> changeCase("valid-input", "huh???")
    undefined
    js> changeCase("", "camel")
    ""

    我的思路:

    先将不符合要求的筛选出来,return undefined;

    然后通过swich(targetCase),分别转换。

    我的答案:

    通过为171 / 174。问题出现在部分不符合要求的不能识别。

    function changeCase(identifier, targetCase){
    
                // Your code here!
                var a=["snake","camel","kebab"];
                var id=identifier.split("");
                if(identifier==""){return "";}
                if(a.indexOf(targetCase)=="-1"|| (identifier.indexOf("-")!=-1 &&identifier.indexOf("_")!=-1 || (identifier.indexOf("-")!=-1 && identifier.indexOf(/A-Z/)!=-1) ||(identifier.indexOf(/A-Z/)!=-1 && identifier.indexOf("_")!=-1))){return undefined;}
                switch(targetCase)
                {
                case "snake":
                    for(var i=0;i<id.length;i++){
                        if(/[A-Z]/.test(id[i])){
                            id.splice(i,0,"_",id[i+1].toLowerCase());
                            i++;
                        }
                        if(/[-]/.test(id[i])){
                            id.splice(i,1,'_')
                        }
                    }
                    return id.join("");
                    break;
                case "camel":
                    for(var i=0;i<id.length;i++){
                        if(/-/.test(id[i]) || /_/.test(id[i])){
                            id.splice(i,2,id[i+1].toUpperCase());
                            //i=i-1;
                        }
                    }
                    return id.join("");
                    break;
                case "kebab":
                    for(var i=0;i<id.length;i++){
                        if(/[A-Z]/.test(id[i])){
                            id.splice(i,0,"-");
                            i++;
                        }
                        if(/[-]/.test(id[i])){
                            id.splice(i,1,'-')
                        }
                    }
                    return id.join("");
                    break;
                }
            }

    优秀答案:

    (1)

    function changeCase(identifier, targetCase){
     if(!/^$|^[a-z]+(([A-Z][a-z]*)+|(-[a-z]+)*|(_[a-z]+)*)$/.test(identifier)) return undefined; 
      switch(targetCase){
        case 'snake': return identifier.replace(/-([a-z])|([A-Z])/g, (_,x,y) => '_'+(x||y.toLowerCase()));
        case 'camel': return identifier.replace(/[-_]([a-z])/g, (_,x) => x.toUpperCase());
        case 'kebab': return identifier.replace(/_([a-z])|([A-Z])/g, (_,x,y) => '-'+(x||y.toLowerCase()));
        default: return undefined;
      }
    }

    (2)

    function changeCase(i, t){
       if ( ( /[A-Z]/.test(i) + /[_]/.test(i) + /[-]/.test(i)) > 1 )  //这个好理解,当[A-Z],-,_,三者任意两个出现的时候,返回undefined
        return undefined;
      else if (t == "snake" ) 
        return i.replace(/[A-Z]/g,a=>'_'+a.toLowerCase()).replace(/-([a-z])/g,(_,a)=> '_'+a);//先大写转“_”+小写,然后将所有-x转成_+小写
      else if ( t== 'camel') 
        return i.replace(/_/g,'-').replace(/-([a-z])/g,(_,a)=> a.toUpperCase()); //先_转-,然后将-后面的第一个字母大写
      else if (t== 'kebab' )
        return i.replace(/_/g,'-').replace(/[A-Z]/g,a=>'-'+a.toLowerCase());//先_转-,然后将大写字母小写
    }

    (3)建议这个,方便好懂,前面两个正则略复杂,不易懂

    将所有单词分开,放入到数组中。

    当需要用的时候,按照snake/kebab/camel的格式连接。

    function changeCase(identifier, targetCase){
    
      if (identifier === '') {
        return '';
      }
      if (/^[a-z-]+$/.test(identifier)) {
        identifier = identifier.split('-');
      }
      else if (/^[a-z_]+$/.test(identifier)) {
        identifier = identifier.split('_');
      }
      else if (/^[a-z][A-Za-z]+$/.test(identifier)) {
        identifier = identifier.replace(/([A-Z])/g, ' $1').toLowerCase().split(' '); //在大写字母前加空格,然后全部转小写,然后按空格分割
      }  
      else {
        return undefined;
      }  
      
      switch (targetCase) {
      
        case 'snake' : identifier = identifier.join('_'); break;
        case 'kebab' : identifier = identifier.join('-'); break;
        case 'camel' : identifier = identifier.map( (x,i) => i === 0 ? x : x[0].toUpperCase() + x.slice(1)).join(''); break;
        
        default : return undefined
      }

    return identifier;
    }

    哈哈哈!

  • 相关阅读:
    部署prerender服务器
    Bzoj4727--Poi2017Turysta
    Bzoj4818--Sdoi2017序列计数
    Heoi2014系列题解
    scoi2017酱油记
    Burnside引理与Pólya定理
    2017省选前北京集训总结
    奥妙重重的随机发生器
    ???--???Insection is not allowed
    反演
  • 原文地址:https://www.cnblogs.com/hiluna/p/8907775.html
Copyright © 2020-2023  润新知