2011-05-17 4 views
4
var icons = $(".IT_Icon").text().trim().split(","); 

Выше, части текста элемента, между запятыми, разбиваются и сохраняются в массиве. Если бы я хотел обернуть или добавить или сделать что-либо для элемента в исходном списке, как бы я это сделал?Вопросы о массивах/Regex

Например:

до:

[cat, dog, mouse, elephant, lion, bird] 

после:

<img src="cat"/>, <img src="dog"/>, <img src="mouse"/>, <img src="elephant"/>, <img src="lion"/>, <img src="bird"/> 

На второй мысли, не мог я просто регулярное выражение, которое находит 'части' из списка , что находится между запятыми и дополняет его тем, что мне нужно? Будь то обертывание или замена?

ОТВЕТ

Это то, что я закончил с:

$(".IT_badge").each(function() { 
    var badges = $(this).text().trim().split(","); 

$(this).html(""); 

    for (i = 0; badges.length > i; i++) { 
     $(this).append($("<img/>").attr("src", 'IT_Badges/' + badges[i] + '.png')); 

     if (!(badges.length === i+1)) { 
      $(this).append(", ");   
     } 
    } 


}); 
+1

Что вы имеете в виду * обертывание * товар? –

+0

Существует несколько способов сделать это, но немного больше информации было бы полезно. Как вы решаете, какой из них заменить? В примере, заменяет ли «слон» «УГАДАЙ», заменяет ли он четвертую запись GUESS? и т. д. И что делается с этим после замены? Является ли намерение просто обновлять текст в промежутке? –

+0

Вы пытаетесь заменить текст пролета? – hunter

ответ

4

Мой любимый способ сделать это просто:

str = '<img src="' + ary.join('"/><img src="') + '"/>'; 

который даст вам одну строку тегов изображения. Если вы хотите сделать это в jQuery, то вроде:

(".IT_Icon").each(function(){ 
    var $this = $(this); 
    $this.html('<img src="' + $this.text() + '"/>'); 
}); 

Вы пытаетесь получить строку? изменить HTML?

+0

+1 для подхалима! – Raynos

+0

Первый способ рода работает. Если в массиве есть только один элемент, он разбивается и выглядит не очень хорошо. Второй способ тоже работает, но он не создает больше одного значка img. –

+0

Я заработал. Я выбрал ваш как правильный, хотя мой сценарий совсем другой, просто потому, что у вас есть аналогичные функции и т. Д. –

1

Я бы порекомендовал вам использовать Array.prototype.map, которые вы можете легко создать, если ваш браузер не поддерживает его.

if (!Array.prototype.map) 
{ 
    Array.prototype.map = function(fun /*, thisp */) 
    { 
    "use strict"; 

    if (this === void 0 || this === null) 
     throw new TypeError(); 

    var t = Object(this); 
    var len = t.length >>> 0; 
    if (typeof fun !== "function") 
     throw new TypeError(); 

    var res = new Array(len); 
    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) 
    { 
     if (i in t) 
     res[i] = fun.call(thisp, t[i], i, t); 
    } 

    return res; 
    }; 
} 

Затем вы можете использовать его как это:

var newIcons = icons.map(function(v) { 
    return "<img src='" + v + ".png' />"; 
}); 
+1

Я бы решительно рекомендовал использовать '$ .map' или' _.map' вместо расширения 'Array.prototype' – Raynos

+0

@Raynos. Преимущество этого метода в том, что любая нативная реализация будет молниеносно быстрой. Firefox 3.5+ поддерживает это, и IE9 + делает это. Также ваш комментарий не дает мне понять, почему вы считаете, что ваш вариант лучше. – ChaosPandion

+0

@ChaosPandion '$ .map' и' _.map' делегировать на собственные карты по обнаружению признаков. Эти реализации довольно умны.Расширение родных прототипов - это дьявол. – Raynos

1

Вы можете использовать функцию jQuery.map():

var s1 = [cat, dog, mouse, elephant, lion, bird]; 
var s2 = $.map(s1, function(x) { 
    var img = new Image(); 
    img.src = x; 
    return img; 
}); 
s2; // => [<img src="cat"/>, <img src="dog"/>, ..., <img src="bird"/>];