質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

2回答

2826閲覧

重複するHTML要素をjQueryで削除するには

sbhduriopk

総合スコア4

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

2クリップ

投稿2019/09/23 14:44

html

1<div class="posts"> 2 <div class="post">こんにちは</div> 3 <div class="post">こんにちは</div> 4 <div class="post">こんにちは</div> 5 <div class="post">Hello</div> 6 <div class="post">よろしく<div> 7 <div class="post">こんばんは<div> 8</div>

div内にある重複している要素(<div class="post">こんにちは</div>)をjQueryで削除して下記のようにしたいです。

html

1<div class="posts"> 2 <div class="post">こんにちは</div> 3 <div class="post">Hello</div> 4 <div class="post">よろしく<div> 5 <div class="post">こんばんは<div> 6</div>

重複しているHTMLを取得して削除する方法について調べてもよくわかりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは
以下、追記も含め、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') の内容を上書きしています。

以上、参考になれば幸いです。

投稿2019/09/23 15:39

編集2019/09/24 13:31
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんな感じですかね・・・

javascript

1<script> 2$(function(){ 3 var p=$('.post').map(function(){return $(this).prop('outerHTML');}).get(); 4 p=p.filter(function(i,j,k){return k.indexOf(i)==j;}); 5 $('.post').remove(); 6 $('.posts').append(p); 7}); 8</script> 9<div class="posts"> 10 <div class="post">こんにちは</div> 11 <div class="post">こんにちは</div> 12 <div class="post">こんにちは</div> 13 <div class="post">こんにちは</div> 14 <div class="post">Hello</div> 15 <div class="post">よろしく</div> 16 <div class="post">こんにちは</div> 17 <div class="post">こんばんは</div> 18 <div class="post">Hello</div> 19</div>

※注意点

<div class="post">よろしく<div>
<div class="post">こんばんは<div>

divタグが閉じずに開始タグになっています。
この状態だと何をやっても無理ですので注意ください

投稿2019/09/24 00:50

yambejp

総合スコア114827

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問