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
  }
  

哈哈哈!

猜你喜欢

转载自www.cnblogs.com/hiluna/p/8907775.html
ALL