2013-03-28 68 views
0

说我有一个字符串数组。我想用一个固定的(公共)字符串来预先给每个字符串加上一个字符串。 我知道在Javascript中,字符串可以像strM = str1 + str2 + str3 + ... + strNstrM = concat(str1, str2, str3, ..., strN)连接起来。考虑这段代码。如何预先使用'this'字符串

var defImgDirPath = 'res/img/'; 
$([ 
    'home-icon-dark.png', 
    'home-icon-light.png' 
]).each(function() { 
    /* 
    * Prepend each string with defImgDirPath 
    */ 
}); 

现在,我不能做this = defImgDirPath + this;(我是愚蠢到试图)

而且,我想return (defImgDirPath + this);但将不能工作。

我在想像this.prependString(defImgDirPath);这样的函数,但是有这样一个函数吗?如果不是,我该如何写一个?

注意:我知道这可以通过for循环很容易和简单地完成,但有什么好玩的呢? :)

+0

我可能是模糊与你在问什么,但你什么时候需要使用它的路径?你是否试图在img标签中使用它?如果路径前缀是常量,您是否可以在需要使用它时连接? – Bmo 2013-03-28 10:46:53

+0

您必须将参数传递给'.each' http://jsfiddle.net/hj2XJ/ – sofl 2013-03-28 10:47:54

+1

使用jQuery并不总是有意义的...当您可以使用常规js时,您应该。 – 2013-03-28 10:52:07

回答

1
var defImgDirPath = 'res/img/'; 
var images = [ 
    'home-icon-dark.png', 
    'home-icon-light.png' 
]; 
$(images).each(function(idx, val) { 
    images[idx] = defImgDirPath + val; 
}); 

console.log(images); 
+0

**正是**我正在寻找!非常感谢。 – 2013-03-28 10:52:20

0

问题是,您正在更改数组中的项目的副本,因此该数组将不受影响。

遍历数组中的索引,并把结果返回数组中:

var arr = [ 'home-icon-dark.png', 'home-icon-light.png' ]; 

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

如果你真的想使用jQuery的循环方法,那么你就需要使用map,让你以数组形式获得结果。请注意,您需要使用回调函数的参数,如this是不是该数组中的项目:

arr = $.map(arr, function(str){ 
    return defImgDirPath + str; 
}); 
+0

我在问题中说过,我知道使用'for'循环可以很容易地完成它。我想用'$ .each'来做。但是,我不知道'$ .map'。尽管如此,'$ .each'看起来更像_elegant_(至少对我而言)。感谢你的回答。干杯! – 2013-03-28 10:51:34

+0

@ZiaUrRehman:您可以使用'$ .each'而不是常规循环来获取迭代的索引,但它不是很优雅,因为回调函数会在闭包中获取对数组的引用,而是直接改变它返回结果。 – Guffa 2013-03-28 11:09:53

+0

你的意思是'$ .each'不会返回一个前缀为'defImgDirPath'的字符串数组? – 2013-03-28 11:16:18

1

在JavaScript的(ECMA 5)的最新标准,你可以做到这一点没有jQuery的:

var defImgDirPath = 'res/img/'; 

['home-icon-dark.png','home-icon-light.png'].map(function(i) { 

     return defImgDirPath + i; }); 

编辑:此外,jquery的地图功能工作也类似。

+1

这意味着它在IE8中不起作用。 – Guffa 2013-03-28 10:51:25

+0

但是,是的,它在最新ie ie ...我从一个MS视频捡起来:) – loxxy 2013-03-28 10:52:01

+0

我认为'$。map'只是一个jQuery函数。它也可以使用纯Javascript吗? – 2013-03-28 10:53:30

0

在Javascript中,this始终引用一个对象(当前上下文对象),因此它永远不会是一个字符串,因此尝试将它与另一个字符串连接将失败,正如您找到的。

但是,没有必要为你正在做的事情使用jQuery或对象;你只需在每个字符串数组的开头添加一个已知值即可。

让我们把它改写使用标准的JavaScript,而jQuery的并发症...

var defImgDirPath = 'res/img/'; 
var images = [ 
    'home-icon-dark.png', 
    'home-icon-light.png' 
]; 

for(var count=0; count<images.length; count++) { 
    images[count] = defImgDirPath + images[count]; 
} 

我已经把图像数组变量,使其更容易看到什么实际的循环代码在做什么。正如你所看到的,这是一个非常简单的循环;这里不需要jQuery魔术。

希望帮助。

0

this.prependString(defImgDirPath);

号字符串是在JavaScript中不可变的。级联到一个新的字符串就可以了,并用它.concat会是什么样

var newString = defImgDirPath.concat(this); // no static function! 

如果不存在,我怎么写呢?

你不能,因为assigning object to "this"是不可能的。

相反,你必须分配给你的工作(使用static $.each,而不是在收集工作)的阵列的属性:

var arr = [ 
    'home-icon-dark.png', 
    'home-icon-light.png' 
]; 
$.each(arr, function(i) { 
    arr[i] = defImgDirPath + this; 
}); 
arr[0] // res/img/home-icon-dark.png 

我也试过return (defImgDirPath + this);

您将需要使用map为,创建一个新的数组:

var arr = $.map([ 
    'home-icon-dark.png', 
    'home-icon-light.png' 
], function(str) { 
    return defImgDirPath + str; 
}); 

当然,它可能没有jQuery的更容易在所有:

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

而且还map可作为本地函数(而不是在过时的浏览器):

var arr = [ 
    'home-icon-dark.png', 
    'home-icon-light.png' 
].map(function(str) { 
    return defImgDirPath + str; 
}); 
+0

当使用'map'方法时,必须使用回调函数的参数,因为'this'指向'window对象。 – Guffa 2013-03-28 10:53:00

+0

@Guffa:谢谢,修正。如果使用'this',将需要'$([...]).map(function(){return defImgDirPath + this;})。get()': – Bergi 2013-03-28 10:59:36

相关问题