问题描述:
In this kata, you will make a function that converts between camelCase
, snake_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;
}
哈哈哈!