0

假设我有一个字符串数组。我想在每个字符串前面加上一个固定的(通用)字符串。我知道在 Javascript 中,字符串可以像strM = str1 + str2 + str3 + ... + strNor一样连接strM = concat(str1, str2, str3, ..., strN)。考虑这段代码。

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循环来完成,但是这样做有什么乐趣呢?:)

4

5 回答 5

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);
于 2013-03-28T10:44:54.633 回答
1

在 javascript (ECMA 5) 的最新标准中,您可以在没有 jquery 的情况下执行此操作:

var defImgDirPath = 'res/img/';

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

        return defImgDirPath + i;  });

编辑:此外,jquery 的 map 功能也类似。

于 2013-03-28T10:45:27.347 回答
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;
});
于 2013-03-28T10:44:45.773 回答
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 魔法。

希望有帮助。

于 2013-03-28T10:46:44.447 回答
0

this.prependString(defImgDirPath);

不,字符串在 JavaScript 中是不可变的。连接到新字符串会很好,使用.concat它看起来像

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

如果不存在,我该如何写一个?

你不能,因为将对象分配给“this”是不可能的。

相反,您必须分配给您正在处理的数组的属性(使用静态$.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;
});
于 2013-03-28T10:48:35.820 回答