在jQuery中获取列表元素内容的数组


101

我有这样的结构:

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

如何使用JavaScript或jQuery将文本作为数组获取?

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

在此之后,我的计划是将其组装为一个字符串(可能使用).join(', '),并以如下格式获取它:

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

Answers:


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

...应该可以解决问题 为了获得您想要的最终输出,join()加上一些串联可以很好地完成:

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

2
jQuery是否保证查询返回的元素的顺序?我会假定返回的顺序与DOM中的顺序相同(即text1,text2,text3),但是我不知道在文档中查找什么以查看是否正确。
styfle 2011年

2
我从未见过以正常阅读顺序以其他任何方式遍历DOM。因此,尽管我无法证明这一点,但我敢打赌,它始终可以从DOM上下遍历DOM :)
2012年

$ .each是否被认为表现不佳?如果是,还有其他方法吗?
丹尼尔(Daniel)

@Daniel,您有多少个列表项是个问题?是的,还有其他方法可以执行相同的操作(可以一次使用$ .map()生成数组),但是它们的作用相同。
Shog9 2013年

@ Shog9:我希望将字典推到列表中,以从表的每一行中获取两个不同列的值。有没有更简单的方法可以做到这一点?提前致谢。
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 2012年

3
更糟糕的是,迭代器是错误的,您需要切换元素和索引,以便它显示function(i,el)。
Kitto 2012年

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/…),由于要知道这是一个绝招,因此将要重新发布
SeanDowney 2012年

我的路应该快一点..还是不?
kimstik

1
kimstik,根据Benchmark.js,我的函数调用分别为Opera和Chrome执行11,252 / 9,685 ops / sec,而您发布的方法调用在40个项目的列表中执行9,666 / 9,083 ops / sec。我认为区别在于示例中从jQuery元素列表到Array的转换,如果有帮助的话。它们非常接近,因此请选择更适合您的编码风格的方法:)
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()-有什么区别
krypru

2

您可以执行以下操作。一行代码就足够了

  • 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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.