【问题标题】:How to prepend a string using 'this'如何使用“this”添加字符串
【发布时间】:2013-03-28 10:40:23
【问题描述】:

假设我有一个字符串数组。我想在每个字符串前面加上一个固定的(通用)字符串。 我知道在 Javascript 中,字符串可以像 strM = str1 + str2 + str3 + ... + strNstrM = 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 循环轻松简单地完成,但这样做有什么乐趣呢? :)

【问题讨论】:

  • 我可能对您的问题感到困惑,但是当您需要使用它时,您将路径放入什么?您是否尝试在 img 标签中使用它?如果路径前缀是常量,你可以在需要使用它的时候连接它吗?
  • 你必须将参数传递给.each jsfiddle.net/hj2XJ
  • 使用 jQuery 并不总是有意义...当您可以使用常规 js 时,您应该这样做。
  • Vanilla js 就好了。当我从 Prototype 迁移到 jQuery 时,除了使用 vanilla js 编写的部分之外,我不得不进行一些重写。 for循环有什么问题?
  • @Bmo:我正在尝试预加载图像。有一个图标home-icon-dark.png。悬停时,图标会更改(转换)为home-icon-light.png。当图标第一次悬停时,浏览器开始获取home-icon-light.png,效果就毁了。虽然它一旦被提取就可以正常工作。我将通过创建一个 Javascript Image()s 数组来预加载 home-icon-light.png,同时获取其余 DOM 元素,因此当图标第一次悬停时,home-icon-light.png 已经被获取并且转换将无缝。 :)

标签: javascript jquery string each prepend


【解决方案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);

【讨论】:

    【解决方案2】:

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

    var defImgDirPath = 'res/img/';
    
    ['home-icon-dark.png','home-icon-light.png'].map(function(i) { 
    
            return defImgDirPath + i;  });
    

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

    【讨论】:

    • 但是是的,它是最新的,即...我从一个 ms 视频中挑选出来的 :)
    • 我认为$.map 只是一个 jQuery 函数。它也可以在纯 Javascript 中使用吗?
    • @ZiaUrRehman: $.map 是 jQuery,Array.prototype.map 是纯 JS
    【解决方案3】:

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

    遍历数组中的索引并将结果放回数组中:

    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;
    });
    

    【讨论】:

    • 我在问题中说过,我知道使用for 循环可以轻松完成。我想用$.each 来做。但是,我不知道$.map。尽管如此,$.each 看起来更优雅(至少对我而言)。感谢你的回答。干杯!
    • @ZiaUrRehman:您可以使用$.each 代替常规循环来获取迭代的索引,但这不是很优雅,因为回调函数将在闭包中获取对数组的引用并直接更改它而不是返回结果。
    • 您的意思是$.each 不会返回以defImgDirPath 开头的字符串数组?
    • @ZiaUrRehman:是的,因为它不会返回任何东西。您只会使用$.each 作为编写for 的一种不同且效率较低的方式。
    【解决方案4】:

    在 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 魔法。

    希望有帮助。

    【讨论】:

      【解决方案5】:

      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;
      });
      

      【讨论】:

      • 使用map方法时,必须使用回调函数的参数,因为this指的是window对象。
      • @Guffa:谢谢,已修复。需要 $([…]).map(function() { return defImgDirPath + this; }).get() 才能使用 this :-/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2019-10-24
      • 2017-11-24
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多