Javascript-将修整函数应用于数组中的每个字符串


77

要修剪数组中的每个字符串,例如,给定

x = [' aa ', ' bb '];

输出

['aa', 'bb']

我的第一次审判是

x.map(String.prototype.trim.apply)

在Chrome中,它得到了“ TypeError:Function.prototype.apply在undefined上调用,这是未定义的而不是函数”。

然后我尝试

x.map(function(s) { return String.prototype.trim.apply(s); });

有用。有什么不同?

Answers:


100

String.prototype.trim.apply是不受约束的Function.prototype.apply方法trimmap将使用字符串,索引和数组作为参数来调用它,而Arg则什么都不会调用(undefined)-但是,期望在函数上调用它:thisapply

var apply = String.prototype.trim.apply;
apply.call(undefined, x[0], 0, x) // TypeError

您可以做的是将该trim函数作为上下文传递call

[' aa ', ' bb '].map(Function.prototype.call, String.prototype.trim)
// ['aa', 'bb']

这里发生的是

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

1
我懂了。我认为fun与的含义相同function(x) { return fun(x); }
神经元

这在IE8上不起作用:String.prototype.trim在IE8上不起作用。
萨钦·凯恩斯

1
@SachinKainth:问题不在于修剪,OP认为它可用。如果您想尝试IE8中的代码段,则显然需要填充trimmap
Bergi 2014年

95

或者可以通过箭头功能解决:

x.map(s => s.trim());

8
我建议:let trimedArr = oldArr.map(str => str.trim());
Flame_Phoenix

@Dominic我正在使用它,但是当我缩小我的js时,它将给出错误,我正在使用javascript-minifier.com网站来缩小js
Sachin Sarola

1
@SachinSarola看起来像现在的Minifier已经不符合现代JS语法了。无论如何,使用webpack来构建和最小化JS作为构建管道的一部分是更好的选择
Dominic


24

没有依赖项的简单变体:

 for (var i = 0; i < array.length; i++) {
     array[i] = array[i].trim()
 }

ES6变体:

const newArray = oldArray.map(string => string.trim())

ES6功能变体:

const trimmedArray = array => array.map(string => string.trim())

15

首先,简单地做一下:

x.map(function(s) { return s.trim() });

然后,第一个不起作用的原因是将字符串作为参数传递给回调,而不是作为上下文传递。当您不传递任何参数给时apply,您会收到与您相同的信息

var f = String.prototype.trim.apply; f.call();

现在,主要是出于娱乐目的,让我们假设您不满意以map这种方式使用回调的事实,并且希望能够使用上下文而不是参数来传递函数。

然后,您可以这样做:

Object.defineProperty(Array.prototype, "maprec", {
  value: function(cb){
      return this.map(function(v){ return cb.call(v) })
  }
});
console.log([' aa ', ' bb '].maprec(String.prototype.trim)); // logs ["aa", "bb"]

我说“主要是为了好玩”,因为修改不属于您的对象(此处为Array的原型)被普遍认为是一种不好的做法。但是您也可以使用数组和回调作为参数来创建一个实用函数。


您的意思是说您会收到相同的消息String.prototype.trim.apply.call(),不是吗?
Butt4cak3

5

我只是比较了一些修整字符串数组以获得最短和最快方法的方法。谁感兴趣,这是对jsperf的性能测试:http ://jsperf.com/trim-array-of-strings

var chunks = "  .root  ,  .parent  >  .child  ".split(',')
var trimmed1 = chunks.map(Function.prototype.call, String.prototype.trim);
var trimmed2 = chunks.map(function (str) { return str.trim(); });
var trimmed3 = chunks.map(str => str.trim());
var trimmed4 = $.map(chunks, $.trim);

注意:jQuery只是在这里比较要键入的字符数;)



3

我想补充一下Bergi的完美答案,对于那些不需要this争论的方法,您可以完成以下工作:

var x = [' aa ', ' bb '],
    y = x.map(Function.prototype.call.bind(String.prototype.trim))

工作得很好!
Sanjay

1
var x = [" aa ", " bb "];
console.log(x); // => [" aa ", " bb "]

// remove whitespaces from both sides of each value in the array
x.forEach(function(value, index){
  x[index] = value.trim();
});

console.log(x); // => ["aa", "bb"]

所有主要的浏览器都支持forEach(),但请注意IE仅从版本9开始才支持。


-1

另一个ES6替代

const row_arr = ['a ', ' b' , ' c ', 'd'];
const trimed_arr = row_arr.map(str => str.trim());
console.log(trimed_arr); // <== ['a', 'b', 'c', 'd']

array_map不是本地JS函数,因此未在此处定义。=>不起作用。
musemind

@Greg此答案的第一版包含一个未指定的array_map()方法
-musemind

@musemind我的错误–我应该查看编辑内容
Greg

-1
    ### Code
    <!-- language: lang-js -->

     var x=  [' aa ', ' b b ', '   c c ']
var x = x.split(",");
            x = x.map(function (el) {
                return el.trim();
                console.log(x)

    ### Output
    <!-- language: lang-none -->
        ["aa", "b b", "c c"]     

2
请始终将答案放在上下文中,而不仅仅是粘贴代码。有关更多详细信息,请参见此处
gehbiszumeis

1
您确定吗?尝试使用您的代码时,引发以下错误:TypeError: x.split is not a function
Nico Haase

###尝试一下此代码。...var x = ['aa','bb','cc'] var x = x.split(“,”); x = x.map(function(el){return el.trim(); console.log(x)
koteswararao pv

### TRY var x = x.split(“,”); x = x.map(function(el){return el.trim(); console.log(x)
koteswararao pv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.