A simple function(or can be used as method) that makes texts lowerCamelCased. Separated by any non-alphabetic characters.
-
-
Save tsaniel/1094627 to your computer and use it in GitHub Desktop.
function f( | |
a, // the text, omitted if used as method | |
b, // placeholder for replace for the first letter of a word | |
c // placeholder for replace for the position | |
){ | |
return | |
++c ? | |
b.toUpperCase() | |
: | |
( | |
a | |
|| | |
this | |
).toLowerCase() | |
.replace(/[^a-z]+(.?)/g,f) | |
} |
function f(a,b,c){return++c?b.toUpperCase():(a||this).toLowerCase().replace(/[^a-z]+(.?)/g,f)} |
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
Version 2, December 2004 | |
Copyright (C) 2011 YOUR_NAME_HERE <YOUR_URL_HERE> | |
Everyone is permitted to copy and distribute verbatim or modified | |
copies of this license document, and changing it is allowed as long | |
as the name is changed. | |
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |
0. You just DO WHAT THE FUCK YOU WANT TO. |
{ | |
"name": "toCamelCase", | |
"description": "Make texts lowerCamelCased", | |
"keywords": [ | |
"CamelCase", | |
"toCamelCase" | |
] | |
} |
<!DOCTYPE html> | |
<title>toCamelCase</title> | |
<div>Expected value: <b>thisIsJustAnExample</b></div> | |
<div>Actual value: <b id="ret"></b></div> | |
<script> | |
var myFunction = function f(a,b,c){return++c?b.toUpperCase():(a||this).toLowerCase().replace(/[^a-z]+(.?)/g,f)} | |
document.getElementById( "ret" ).innerHTML = myFunction('this-is0just\nan!@#$%example') | |
</script> |
Thanks @subzey! Changed.
Thanks again @subzey, the second tip is really awesome!
@tsaniel, not at all!
Another note: function works unexpectedly if argument is an empty string
I have tried to fix, thanks!
you can shave another byte by using "top" instead of "this"...
The this here is actually this.
For example,
String.prototype.toCamelCase = function f(a,b){return b?b.toUpperCase():(a||this).toLowerCase().replace(/[^a-z]+([a-z])/g,f)}
'this-is0just\nan!@#$%example'.toCamelCase();
If you are going to go prototypical on me, I'll pass. ;-)
I tried to create a version that works without this
(introduced some problems for me) and without a function name f
in the global scope. (Update: It's not in the global scope but I simply don't like this.) It also strips non-letters from the end of the string (your version does not). It's 97 bytes, a little bit bigger than your attempt. If you don't care about the "non-letters at the end of string" case you can remove the ?
.
function(a){return a.toLowerCase().replace(/[^a-z]+(.?)/g,function(a,b){return b.toUpperCase()})}
@maettig nice try!
But the f
doesn't leak to the global scope, see Named function expressions.
@tsaniel, you can save 4 bytes by replacing [^a-z]+([a-z])
with [^a-z]+(.)
. (Note: This changes the behavior for some strings, e.g. "x12"
becomes "x2"
.) But you can not use [^a-z]+(.?)
to strip non-letters from the end of the string as in my approach without introducing some kind of typeof
, e.g. ''+b===b
. And this will make your version 1 byte longer than mine. ;-)
@maettig: wouldn't that fail on spaces?
@atk, no, why? ' aa bb '
becomes 'AaBb'
in my version (but 'AaBb '
in @tsaniel's current one). ''+b===b
is mentioned in the Byte-saving Techniques wiki. It returns true if b is a string, no matter what's in the string.
@maettig I've reflected the change, thanks!
By the way, we can use a variable c
and the trick ++c
rather than ''+b===b
.
Another cool trick. By the way, I still don't understand why the this
is in the code?
It's for the prototyping use.
See https://gist.github.com/1094627#gistcomment-56234.
toCamelCase("a b c")
returns"aBundefinedCundefined"
It can be fixed (and shortened) by replacing
/([a-z])([a-z]+)?/g
with/([a-z])([a-z]*)/g
.Another byte may be shaved by rearranging the
return
statement:function(a){return(a||this).toLowerCase(a="").replace(/([a-z])([a-z]*)/g,function(b,c,d){a+=a?c.toUpperCase()+d:b}),a}