jQueryでリスト要素コンテンツの配列を取得する


101

私はこのような構造を持っています:

<ul>
  <li>text1</li>
  <li>text2</li>
  <li>text3</li>
</ul>

テキストを配列として取得するには、javascriptまたはjQueryをどのように使用しますか?

['text1', 'text2', 'text3']

この後の私の計画は、おそらくを使用してそれを文字列にアセンブル.join(', ')し、次のような形式で取得することです。

'"text1", "text2", "text3"'

回答:


141
var optionTexts = [];
$("ul li").each(function() { optionTexts.push($(this).text()) });

...トリックを行う必要があります。あなたが探している最終的な出力を得るために、join()さらにいくつかの連結がうまくいきます:

var quotedCSV = '"' + optionTexts.join('", "') + '"';

2
jQueryは、クエリによって返される要素の順序を保証しますか?返される順序はDOMの順序と同じである(つまり、text1、text2、text3)と想定しますが、これが正しいかどうかを確認するためにドキュメントで何を探すべきかわかりません。
スタイル

2
通常の読み取り順序とは異なる方法でDOMをトラバースすることはありません。したがって、証明することはできませんが、ファームが常にDOMを上から下にトラバースすることに間違いはないでしょう:)
Flater

$ .eachはパフォーマンスが悪いと見なされていませんか?はいの場合、それを行う他の方法はありますか?
Daniel

@Danielさん、これが問題だと思うリスト項目はいくつありますか?ええ、同じことを行う他の方法があります($ .map()を使用して配列を一度に生成することもできます)が、同じことになります。
Shog9 2013年

@ Shog9:テーブルの各行から2つの異なる列の値を取得するリストにディクショナリをプッシュしたい。それを行う簡単な方法はありませんか?前もって感謝します。
ln2khanal 2013

71

冗長な中間配列がない場合:

arr = $('li').map(function(i,el) {
    return $(el).text();
}).get();

jsfiddle デモを見る


6
あなた.get()は最後に逃します。
Felix Kling

4
Felix Klingsの提案に基づく:arr = $( 'li')。map(function(){return $(this).text();})。get();
EmilStenström

1
「関数を取得」が必要な理由がわかりません。
crsuarezf 2011

1
api.jquery.com/mapは、.get()が必要な理由を説明しています(「戻り値はjQueryでラップされた配列なので、基本的な配列を操作するために、返されたオブジェクトをget()することは非常に一般的です。」)。
Kitto

3
さらに悪いことは、イテレータが間違っているということです。それはfunction(i、el)と言うように要素とインデックスを切り替える必要があるということです。
キトー

14

そしてきれいなjavascriptで:

var texts = [], lis = document.getElementsByTagName("li");
for(var i=0, im=lis.length; im>i; i++)
  texts.push(lis[i].firstChild.nodeValue);

alert(texts);

14

kimstikは近かったが、完全ではなかった。

便利なワンライナーでそれを行う方法は次のとおりです。

$.map( $('li'), function (element) { return $(element).text() });

jQueryのmap関数の完全なドキュメントは次のとおりです。非常に便利です。http//api.jquery.com/jQuery.map/

完全に答えるために、ここにあなたが探していた完全な機能があります:

$.map( $('li'), function (element) { return $(element).text() }).join(', ');

私はこれをここで見ました(stackoverflow.com/questions/4856283/…)、それは知っている素晴らしいトリックなので再投稿するつもり
でした

私の方法は少し速くなります。
kimstik 2016

1
kimstik、Benchmark.jsによると、私の関数呼び出しはOperaとChromeでそれぞれ11,252 / 9,685 ops /秒を実行しますが、投稿したメソッド呼び出しは40アイテムのリストで9,666 / 9,083 ops /秒を実行します。私の違いは、あなたの例ではjQuery要素リストから配列への変換にあると思います。それらは非常に近いので、コーディングスタイルにより適したものを選択してください:)
Cybolic

6
var arr = new Array();

$('li').each(function() { 
  arr.push(this.innerHTML); 
})

1
innerHTMLに依存する代わりに、「this」をjQueryオブジェクトに変更し、jQueryネイティブテキストメソッドを使用する必要があります。$(this).text()
Nathan Strutz、

3
どうして?最終的に$(this).html()はネイティブメソッドを使用します
Khodor

この場合、新しいArray()の代わりに[]を使用することをお
勧め

2

あなたは次のようにすることができます。コードは1行で十分です

  • let array = $('ul>li').toArray().map(item => $(item).html());
  • 興味のある要素を取得する

    1. 子供を得る

    2. toArray()メソッドから配列を取得する

    3. 必要な結果を除外する

let array = $('ul>li').toArray().map(item => $(item).html());
console.log(array);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <li>text1</li>
  <li>text2</li>
  <li>text3</li>
</ul>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.