Удалите повторяющиеся слова в списке элементов с помощью jQuery

#jquery

#jquery

Вопрос:

У меня есть список с несколькими элементами, которые содержат некоторый повторяющийся текст, который я хочу удалить или скрыть. Итак, из этого:

 <ul class="juicy">
<li>Juicy Green Apples</li>
<li>Juicy Green Tomatoes</li>
<li>Juicy Green Broccoli</li>
</ul>
  

Я хотел бы добиться этого:

 <ul class="juicy">
<li>Apples</li>
<li>Tomatoes</li>
<li>Broccoli</li>
</ul>
  

Комментарии:

1. Это всегда один и тот же текст? Или вам нужно общее решение для любых дублирующихся слов в любом месте текста?

2. Да, слова будут известны заранее. И действительно, могут быть и другие строки, которые нужно удалить.

Ответ №1:

.text() Метод jQuery может справиться с этим довольно легко, если текст, который вы заменяете, известен заранее.

 var textToReplace = "Juicy Green",
    re = new RegExp(textToReplace,"i");
$(".juicy li").text(function(index,text){
  return text.replace(re,'');
});
  

Редактировать: ответ на вопрос в комментарии:

Что-то вроде этого:

 var textToReplaceArr = ["Juicy Green","Sour Yellow"];
for (var i = 0; i < textToReplaceArr.length; i  ) {
  $(".juicy li").text(function(index,text){
    var re = new RegExp(textToReplaceArr[i],"i");
    return text.replace(re,'');
  });
}
  

Комментарии:

1. Спасибо, Кевин. Это прекрасно работает. Слова действительно были бы известны заранее. Что, если в том же UL был другой набор слов, который я хотел удалить? Я пробовал просто дублировать код и заменять ключевые слова другим набором, и это работает. Мне просто интересно, есть ли более элегантный / лаконичный способ?

Ответ №2:

Вы хотите попробовать что-то динамическое?

 $(document).ready(

function() {
    var repeatedWordsArray = new Array();
    var wordsToRemoveArray = new Array();
    var i = 0;
    $($("ul.juicy > li").map(function() {
        return $(this).text();
    }).get().join(" ").split(/s /g)).each(   //Joins the text of all elements, appends space between them and then splits with space character

    function() {
        repeatedWordsArray[this] = repeatedWordsArray[this] == undefined ? 1 : repeatedWordsArray[this]   1;      //Increments the counter when the same word is encountered
        if (repeatedWordsArray[this] == 2) {     //If found twice, make a note of the word
            wordsToRemoveArray[i  ] = this;
        }
    });
    if (wordsToRemoveArray.length > 0) {
        $("ul.juicy > li").each(
        function() {
            var ulElement = this;
            $(wordsToRemoveArray).each(
                function() {
                    var regexp = new RegExp('^\s*\w \s*$');
                    if(!$(ulElement).text().match(regexp)) {     //Do not match if the text of element contains a single word with or without spaces at its ends
                        regexp = new RegExp('\s*'   this   '\s*','g');
                        $(ulElement).text($(ulElement).text().replace(regexp, ''));   //Set the text of the element after removing the repeatedly found word
                    }
                }
                );
            }
        );
    }
}
);
  

Это работает и для следующего ul:

 <ul class="juicy">
    <li>Juicy Green Apples</li>
    <li>Juicy Green Tomatoes</li>
    <li>Juicy Green Broccoli</li>
    <li>Juicy</li>
    <li>      Green  </li>
 </ul>
  

Комментарии:

1. Джеймс, это довольно круто. Спасибо за предложение. Однако, если бы я должен был использовать код, куда бы я вставил ключевые слова, которые я хочу удалить?

2. Вам не нужно было бы добавлять ключевое слово для реализации этого. Вам просто нужно будет указать имя класса для тех элементов ul, для которых должна выполняться эта операция. Здесь $(«ul.juicy > li») определяет, к каким элементам это должно применяться. ‘ul.juicy > li’ означает, что эти непосредственные элементы ‘li’ внутри ‘ul’ родительского элемента, у которого есть класс с именем ‘juicy’. Это происходит дважды в коде. Если вы замените это своим селектором jQuery, все должно работать нормально.

3. А, понятно. Это просто работает автоматически, удаляя любые повторяющиеся ключевые слова в ul. Спасибо. Очень аккуратно.