I have an array of strings. I want to trim each string in the array.
I thought using [].map() with ''.trim() would work...
[' a', ' b ', 'c'].map(String.prototype.trim);
...but my console said...
TypeError: String.prototype.trim called on null or undefined
jsFiddle.
I can't see any null or undefined values in my array.
String.prototype.trim() and Array.prototype.map() are defined in Chrome 17, which I'm using to test.
Why doesn't this work? I get the feeling I have overlooked something obvious.
I realise I could loop or drop a function in there. That's not the point of this question, however.
What @Slace says is the right explanation. @ThomasEding's answer also works but has one terrible inefficieny that it may create functions within a loop, which is not a good thing to do.
Another way of doing would be (reference here):
[' a', ' b ', 'c'].map(Function.prototype.call, String.prototype.trim);
// gives ["a", "b", "c"]
Standard browser disclaimer: This will work wherever Function.prototype.call and String.prototype.trim will work and for older browsers, you can easily substitute trim with a polyfill like this:
if(!String.prototype.trim) {
String.prototype.trim = function () {
return this.replace(/^\s+|\s+$/g,'');
};
}
Update: Interstingly, while this works fastest in Chrome, @ThomasEding's method runs slightly faster in IE10 and FF20 - http://jsperf.com/native-trim-vs-regex-trim-vs-mixed
That's because trim is not being called with the proper this context. Remember that this is dynamically bound in JS. You will have to create a wrapper to pass to trim to properly bind this:
[' a', ' b ', 'c'].map(function (str) {
return str.trim();
});
trim is on the String prototype, meaning that it expects the this context to be that of a string where as the map method on Array provides the current array item as the first argument and the this context being the global object.
With ES6 syntax it can be as easy as this:
[' hello ', ' world'].map(str => str.trim());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With