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]+)?/gwith/([a-z])([a-z]*)/g.Another byte may be shaved by rearranging the
returnstatement:function(a){return(a||this).toLowerCase(a="").replace(/([a-z])([a-z]*)/g,function(b,c,d){a+=a?c.toUpperCase()+d:b}),a}