รับอาร์เรย์ของเนื้อหาองค์ประกอบรายการใน 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) แต่ฉันไม่รู้ว่าจะต้องค้นหาอะไรในเอกสารประกอบเพื่อดูว่าเป็นจริงหรือไม่
styfle

2
ฉันไม่เคยเห็นมันข้าม DOM ด้วยวิธีอื่นใดที่ลำดับการอ่านปกติ แม้ว่าฉันจะไม่สามารถพิสูจน์ได้ แต่ฉันก็พนันได้เลยว่าฟาร์มนั้นจะเดินผ่าน DOM จากบนลงล่าง :)
Flater

ไม่ถือว่า $ .each มีผลงานไม่ดีใช่หรือไม่? ถ้าใช่มีวิธีอื่นอีกไหม
Daniel

คุณมีรายการที่เป็นปัญหา @Daniel กี่รายการ? ใช่มีวิธีอื่นในการทำสิ่งเดียวกัน (คุณสามารถใช้ $ .map () เพื่อสร้างอาร์เรย์ในครั้งเดียว) แต่ก็มีจำนวนเท่ากัน
Shog9

@ Shog9: ฉันต้องการดันพจนานุกรมไปยังรายการโดยใช้ค่าจากคอลัมน์สองคอลัมน์ที่แตกต่างกันจากแต่ละแถวของตาราง ไม่มีวิธีที่ง่ายกว่านี้ไหม ขอบคุณล่วงหน้า.
ln2khanal

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 ();
Emil Stenström

1
ฉันไม่เข้าใจว่าทำไมต้องมี "get function"
crsuarezf

1
api.jquery.com/mapอธิบายว่าเหตุใดจึงจำเป็นต้องมี. get () ("เนื่องจากค่าที่ส่งคืนเป็นอาร์เรย์ที่ห่อด้วย jQuery จึงเป็นเรื่องปกติมากที่จะได้รับ () วัตถุที่ส่งคืนเพื่อทำงานกับอาร์เรย์พื้นฐาน")
กิตติโต

3
สิ่งที่แย่กว่านั้นคือตัววนซ้ำผิดคุณต้องสลับองค์ประกอบและดัชนีเพื่อให้มันบอกว่าฟังก์ชัน (i, el)
กิตติโต


14

kimstik ก็ใกล้ แต่ไม่มาก

นี่คือวิธีการทำในซับเดียวที่สะดวก:

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

นี่คือเอกสารฉบับเต็มสำหรับฟังก์ชั่นแผนที่ของ jQuery ซึ่งมีประโยชน์มาก: http://api.jquery.com/jQuery.map/

เพื่อตอบให้ครบถ้วนนี่คือฟังก์ชันที่สมบูรณ์ที่คุณกำลังมองหา:

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

ฉันเพิ่งเห็นสิ่งนี้ที่นี่ ( stackoverflow.com/questions/4856283/… ) และจะโพสต์ใหม่เนื่องจากเป็นเคล็ดลับที่ดีที่ควรรู้
SeanDowney

ทางของฉันควรเร็วกว่านี้หน่อย .. หรือเปล่า?
kimstik

1
kimstik อ้างอิงจาก Benchmark.js การเรียกใช้ฟังก์ชันของฉันทำได้ 11,252 / 9,685 ops / วินาทีสำหรับ Opera และ Chrome ตามลำดับในขณะที่วิธีการโทรที่คุณโพสต์ทำได้ 9,666 / 9,083 ops / วินาทีในรายการ 40 รายการ ฉันคิดว่าความแตกต่างมาจากการแปลงจากรายการองค์ประกอบ 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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.