วิธีรับจำนวน N องค์ประกอบแรกจากอาร์เรย์


383

ฉันกำลังทำงานกับ Javascript (ES6) / FaceBook ตอบสนองและพยายามรับ 3 องค์ประกอบแรกของอาร์เรย์ที่มีขนาดแตกต่างกันไป ฉันต้องการทำสิ่งที่เทียบเท่ากับ Linq take (n)

ในไฟล์ Jsx ของฉันฉันมีดังต่อไปนี้:

var items = list.map(i => {
  return (
    <myview item={i} key={i.id} />
  );
});

จากนั้นเพื่อรับ 3 รายการแรกที่ฉันลอง

  var map = new Map(list);
    map.size = 3;
    var items = map(i => {
      return (<SpotlightLandingGlobalInboxItem item={i} key={i.id} />);
    });

สิ่งนี้ไม่ทำงานเนื่องจากแผนที่ไม่มีฟังก์ชั่นการตั้งค่า

คุณช่วยได้ไหม


4
บางทีฉันอาจเข้าใจผิดถึงปัญหา แต่ทำไมไม่ใช้สิ่งที่ชอบlist.slice(0, 3);แล้วทำซ้ำสิ่งนั้น
Jesse Kernaghan

ทำไมคุณต้องการใช้แผนที่ ถ้าฉันเข้าใจความต้องการของคุณถูกต้องคุณสามารถใช้ชิ้นเพื่อใช้องค์ประกอบแรก
Abhishek Jain

หากครูบอกให้ใช้แผนที่ :) ฉันขอโทษถ้านี่เป็นคำถามที่ถูกกฎหมาย แต่มันก็รู้สึกเหมือนการบ้าน
diynevala

โปรดพิจารณาการเปลี่ยนคำตอบที่ยอมรับเป็นคำตอบที่พิสูจน์แล้วว่ามีประโยชน์ต่อสาธารณะมากขึ้น
Brian Webster

คำตอบ:


401

ฉันเชื่อว่าสิ่งที่คุณกำลังมองหาคือ:

// ...inside the render() function

var size = 3;
var items = list.slice(0, size).map(i => {
    return <myview item={i} key={i.id} />
}

return (
  <div>
    {items}
  </div>   
)

619

ในการรับnองค์ประกอบแรกของอาร์เรย์ให้ใช้

array.slice(0, n);

58
โปรดทราบว่าsliceฟังก์ชั่นในอาร์เรย์ส่งคืนสำเนาตื้นของอาร์เรย์และไม่ได้แก้ไขอาร์เรย์เดิม developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

30

นี้อาจจะแปลก แต่lengthคุณสมบัติของอาร์เรย์จะไม่ใช้เพียงเพื่อให้ได้จำนวนขององค์ประกอบอาร์เรย์ แต่ก็ยังสามารถเขียนได้และสามารถนำมาใช้กับความยาวชุดอาร์เรย์ของการเชื่อมโยง MDN นี้จะกลายพันธุ์อาร์เรย์

หากไม่จำเป็นต้องใช้อาร์เรย์ปัจจุบันอีกต่อไปและคุณไม่สนใจเกี่ยวกับการเปลี่ยนไม่ได้หรือไม่ต้องการจัดสรรหน่วยความจำเช่นสำหรับเกมวิธีที่เร็วที่สุดคือ

arr.length = n

เพื่อล้างอาร์เรย์

arr.length = 0

คุณแน่ใจหรือว่านี่เร็วกว่าarr = []?
GrayedFox

3
ประโยชน์ที่นี่คือการหลีกเลี่ยงการจัดสรรหน่วยความจำ การเริ่มต้นวัตถุใหม่ในเวลาทำงาน i..e สำหรับเกมคือการเรียกตัวรวบรวมข้อมูลขยะและ jank
Pawel

น่าจะกล่าวถึงว่าสิ่งนี้จะกลายพันธุ์อาร์เรย์ที่ชิ้นจะกลับสำเนาตื้น สิ่งนี้จะแตกต่างกันมากหากคุณต้องการใช้ประโยชน์จากรายการที่คุณเพิ่งตัดทอนอย่างถาวร
Ynot

1
@ ไม่เป็นไรฉันจะทำให้มันชัดเจนขึ้นนิดหน่อย
Pawel

4
นี่จะเป็นการขยายอาร์เรย์ถ้ามันมีขนาดเล็กกว่า N
Oldrich Svec

13

อย่าลองทำโดยใช้ฟังก์ชั่นแผนที่ ควรใช้ฟังก์ชันแผนที่เพื่อทำแผนที่ค่าจากสิ่งหนึ่งไปอีกสิ่งหนึ่ง เมื่อจำนวนอินพุทและเอาท์พุทตรงกัน

ในกรณีนี้ใช้ฟังก์ชั่นตัวกรองซึ่งยังมีอยู่ในอาร์เรย์ ฟังก์ชั่นตัวกรองจะใช้เมื่อคุณต้องการที่จะเลือกค่าที่จะกำหนดเกณฑ์ จากนั้นคุณสามารถเขียนรหัสของคุณเช่น

var items = list
             .filter((i, index) => (index < 3))
             .map((i, index) => {
                   return (
                     <myview item={i} key={i.id} />
                   );
              });

1
คุณกำลังถูกต้องโดยรวม แต่ความหมายที่คุณควรใช้ตัวกรองเพื่อแรกกรองลงชุดขององค์ประกอบแล้ว map กรองลงชุดถ้าคุณจะพาวิธีการนี้
Chris

8
ฟังก์ชั่นตัวกรองจะผ่านองค์ประกอบทั้งหมดในอาเรย์ในขณะที่ชิ้นส่วนจะไม่ทำดังนั้นจึงเป็นการดีกว่าที่นักแสดงควรใช้สไลซ์ใช่ไหม
elQueFaltaba

11

คุณสามารถกรองการใช้indexอาเรย์

var months = ['Jan', 'March', 'April', 'June'];
months = months.filter((month,idx) => idx < 2)
console.log(months);


2
.filterด้วยตัวของมันเองมันไม่ใช่ทางเลือกที่ดีอย่างน้อยถ้าอาร์เรย์อินพุตอาจยาว .filterต้องผ่านทุกองค์ประกอบของอาร์เรย์ที่ตรวจสอบสภาพของมัน .sliceจะไม่ทำแบบนี้ แต่จะแยกองค์ประกอบ n แรกแล้วหยุดการประมวลผล - ซึ่งแน่นอนว่าจะเป็นสิ่งที่คุณต้องการสำหรับรายการยาว (ดังที่ @ elQueFaltaba ได้กล่าวไปแล้วในความเห็นต่อคำตอบอื่น)
MikeBeaton

9

ต่อไปนี้ใช้งานได้สำหรับฉัน

array.slice( where_to_start_deleting, array.length )

นี่คือตัวอย่าง

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.slice(2, fruits.length);
//Banana,Orange  ->These first two we get as resultant

4
ในตัวอย่างแรกที่คุณใช้แต่ในครั้งที่สองที่คุณใช้slice splice
Veslav

3
สิ่งนี้ก็ผิด คุณจะได้รับ["Apple", "Mango"]จากสิ่งนี้ ส่วนแรกของการแบ่งไม่ใช่ "ตำแหน่งที่จะเริ่มการลบ" มันเป็นจุดเริ่มต้นของการแบ่ง มันไม่ได้ปรับเปลี่ยนอาร์เรย์เดิมและจะไม่ลบอะไรเลย
Angel Joseph Piscola


0

ใช้ตัวกรอง

ไม่ใช่วิธีปฏิบัติที่ดีที่สุด แต่เป็นวิธีอื่น

const cutArrByN = arr.filter((item, idx) => idx < n);

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