วิธีใช้ ES6 Fat Arrow เพื่อ. filter () อาร์เรย์ของวัตถุ


139

ฉันกำลังพยายามใช้ฟังก์ชั่นลูกศร ES6 .filterเพื่อส่งคืนผู้ใหญ่ (แจ็ค & จิล) ดูเหมือนว่าฉันไม่สามารถใช้คำสั่ง if

ฉันต้องรู้อะไรบ้างเพื่อที่จะทำสิ่งนี้ใน ES6

var family = [{"name":"Jack",  "age": 26},
              {"name":"Jill",  "age": 22},
              {"name":"James", "age": 5 },
              {"name":"Jenny", "age": 2 }];

let adults = family.filter(person => if (person.age > 18) person); // throws error

(8:37) SyntaxError: unknown: Unexpected token (8:37)
|let adults = family.filter(person => if (person.age > 18) person);

ตัวอย่าง ES5 ที่ทำงานของฉัน:

let adults2 = family.filter(function (person) {
  if (person.age > 18) { return person; }
});

(8:37) SyntaxError: ไม่รู้จัก: โทเค็นที่ไม่คาดคิด (8:37) | ให้ผู้ใหญ่ = family.filter (person => ถ้า (person.age> 18) คน);
Henry Zhu

คำตอบ:


236

ดูเหมือนว่าฉันไม่สามารถใช้คำสั่ง if

ลูกศรฟังก์ชั่นทั้งอนุญาตให้มีการใช้การแสดงออก หรือบล็อกเป็นร่างกายของพวกเขา ผ่านการแสดงออก

foo => bar

เทียบเท่ากับบล็อกต่อไปนี้

foo => { return bar; }

อย่างไรก็ตาม

if (person.age > 18) person

ไม่ใช่การแสดงออกifเป็นคำสั่ง ดังนั้นคุณจะต้องใช้บล็อกถ้าคุณต้องการใช้ifในฟังก์ชั่นลูกศร:

foo => {  if (person.age > 18) return person; }

ในขณะที่ในทางเทคนิคแก้ปัญหานี้การใช้งานที่สับสน.filterเพราะมันแสดงให้เห็นว่าคุณต้องส่งกลับค่าที่ควรจะมีอยู่ในอาร์เรย์เอาท์พุท อย่างไรก็ตามการเรียกกลับที่ส่งไปยัง.filterควรส่งคืนบูลีนเช่นtrueหรือfalseระบุว่าองค์ประกอบควรจะรวมอยู่ในอาร์เรย์ใหม่หรือไม่

ดังนั้นสิ่งที่คุณต้องการคือ

family.filter(person => person.age > 18);

ใน ES5:

family.filter(function (person) {
  return person.age > 18;
});

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

2
@HenryZhu: ใช่ แต่ตัวอย่างของฉันเสมอกลับอย่างใดอย่างหนึ่งfalseหรือtrueตั้งแต่person.age > 18อยู่เสมออย่างใดอย่างหนึ่งหรือfalse true
เฟลิกซ์คลิง

รุ่นที่มี "ยกเลิกการบล็อก" ถ้าควรจะกลับมาperson(แน่นอนว่ามันจะไม่ทำอย่างนั้นเมื่อคุณชี้ ... ) หากการแก้ไขครั้งแรกของคุณทำอย่างนั้นจริง ๆ แล้ว ( foo => { if (person.age > 18) return person }) คุณจะได้รับเทียบเท่ากับสิ่งที่ OP ใช้ในรหัส ES5 ในขณะที่เป็นรหัสที่สับสนมันใช้งานได้และจะแก้ปัญหาได้ return personจะบีบบังคับไปtrueและกลับไม่มี "จะกลับมา" ซึ่งจะมีการบังคับให้undefined false
Amit

1
@Amit: แน่นอน ฉันคิดว่าเพราะคำตอบอื่น ๆ แนะนำฉันไม่ต้องทำ อย่างไรก็ตามสิ่งนี้อาจทำให้สับสนดังนั้นฉันจึงอัปเดต
เฟลิกซ์คลิง

2
@ เพิ่งบอริส: .filterไม่แน่ใจว่าสิ่งนี้จะประสบความสำเร็จที่นี่ด้วย คุณหมายถึงฟังก์ชั่นลูกศรโดยทั่วไปหรือไม่
เฟลิกซ์คลิง

46

คุณไม่สามารถส่งคืนโดยนัยได้ifคุณต้องมีเครื่องมือจัดฟัน:

let adults = family.filter(person => { if (person.age > 18) return person} );

สามารถทำให้ง่ายขึ้นแม้ว่า:

let adults = family.filter(person => person.age > 18);

เยี่ยมเลยอันที่สองใช้ได้ คนแรกส่งกลับอาร์เรย์ที่ว่างเปล่า ความคิดใด ๆ
Henry Zhu

1
@HenryZhu: มันใช้งานได้ดี (อาจมีบางอย่างผิดปกติกับรหัสหรือ transpiler ของคุณ) แต่นั่นไม่ใช่วิธีที่ถูกต้องอยู่ดี
เฟลิกซ์คลิง

1
จะทำอย่างไรในกรณีที่คุณมีคำสั่งอื่น? ฉันพยายามที่จะเห็นสิ่งนี้ด้วยไตรภาค แต่ไม่สามารถระบุไวยากรณ์ที่ถูกต้องได้
Winnemucca

@stevek เหมือนกับที่คุณทำกับฟังก์ชั่นปกติเหมือนในตัวอย่างแรก
Kit Sunde

0

ง่ายเหมือนที่คุณสามารถใช้ const adults = family.filter(({ age }) => age > 18 );

const family =[{"name":"Jack",  "age": 26},
              {"name":"Jill",  "age": 22},
              {"name":"James", "age": 5 },
              {"name":"Jenny", "age": 2 }];

const adults = family.filter(({ age }) => age > 18 );

console.log(adults)


0

นี่คือวิธีการแก้ปัญหาของฉันสำหรับผู้ที่ใช้hook; หากคุณกำลังแสดงรายการในตารางและต้องการลบรายการที่เลือกคุณสามารถใช้วิธีนี้

var list = data.filter(form => form.id !== selectedRowDataId);
setData(list);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.