Javascript - Apply trim function to each string in an array
Want to trim each string in an array, e.g., given
x = [' aa ', ' bb '];
output
['aa', 'bb']
My first trial is
x.map(String.prototype.trim.apply)
It got "TypeError: Function.prototype.apply was called on undefined, which is a undefined and not a function" in chromium.
Then I tried
x.map(function(s) { return String.prototype.trim.apply(s); });
It works. What's the difference?
Or this can be solved with arrow functions:
x.map(s => s.trim());
String.prototype.trim.apply
is the Function.prototype.apply
method without being bound to trim
. map
will invoke it with the string, the index and the array as arguments and nothing (undefined
) for the this
Arg - however, apply
expects to be called on functions:
var apply = String.prototype.trim.apply;
apply.call(undefined, x[0], 0, x) // TypeError
What you can do is passing the trim
function as the context for call
:
[' aa ', ' bb '].map(Function.prototype.call, String.prototype.trim)
// ['aa', 'bb']
What happens here is
var call = Function.prototype.call,
trim = String.prototype.trim;
call.call(trim, x[0], 0, x) ≡
trim.call(x[0], 0, x) ≡
x[0].trim(0, x); // the arguments don't matter to trim
The simple variant without dependencies:
for (var i = 0; i < array.length; i++) {
array[i] = array[i].trim()
}
ES6 variant:
const newArray = oldArray.map(string => string.trim())
ES6 function variant:
const trimmedArray = array => array.map(string => string.trim())
If you are using JQuery, then a better way to do this, as it will work with IE8 as well (I need to support IE8) is this:
$.map([' aa ', ' bb ', ' cc '], $.trim);