こんにちは
以下、追記も含め、3つの回答コードを挙げます。
回答コード その1
$('.post')
の中で削除の対象になるものを filter
で抽出して remove
すればよいので、たとえば以下で出来ます。
javascript
1$('.post').filter(
2 function() {
3 const t = $(this).text();
4 return this !== $(`.post:contains('${t}')`).get(0);
5 }
6).remove();
ただし、上記のコードでは、 filter
に与える関数の中で、
$(`.post:contains('${t}')`).get(0)
を実行して、あるテキストを含む1個以上の<div class="post">
の中で、最初の要素を filterによるループの毎回、取ってきており、その点では無駄なことをやっています。この無駄を省くとすれば、filter によるループにおいて出現するテキストを順次どこかに保存していき、そこに既に入っているテキストを持つ <div>
が見つかったら、それを削除対象としてfilterで残るようにします。以下は、この考えをもとに、保存場所として Set を使う例です。
回答コード その2
javascript
1const set = new Set();
2
3$('.post').filter(
4 function() {
5 const t = $(this).text();
6 if (set.has(t))
7 return true;
8 else {
9 set.add(t);
10 return false;
11 }
12 }
13).remove();
とはいえ、よほどたくさんの <div class="post">
があるのでもない限りは、パフォーマンスに(ユーザーが体感し得るほどの)顕著な差が出るとは思えませんので、コード行数の少ない冒頭に書いたほうのコードでもよいかと思います。
追記
もうひとつ、解法となるコードを示します。
配列やオブジェクトの操作で便利なライブラリ lodash の_.uniqBy を使うと、配列から重複する要素を抜き、残った要素の順序は変わらない配列を得ることができます。何が同じであることをもって重複とするのかも、第2引数の関数で与えることができます。
これを使うと、以下のような短いコードで、テキストが重複する <div class="post">
の除去を書くことができます。
回答コード その3
javascript
1$('.posts').html(
2 _.uniqBy($('.post').toArray(), e => e.innerText )
3);
上記のコードでは、$('.post')
の配列から重複する(=テキストが同じ)要素を抜いた配列を作り、 その配列で$('.posts')
の内容を上書きしています。
以上、参考になれば幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。