Angular 2 TypeScript วิธีค้นหาองค์ประกอบใน Array


131

ฉันมีส่วนประกอบและบริการ:

ส่วนประกอบคือ:

export class WebUserProfileViewComponent {
    persons: Person [];
    personId: number;
    constructor( params: RouteParams, private personService: PersonService) {
          
        
           this.personId = params.get('id');
           this.persons =  this. personService.getPersons();
           console.log(this.personId);  
        }
}

บริการ:

@Injectable()
export class PersonService {
      getPersons(){
        var persons: Person[] = [
            {id: 1, firstName:'Hans', lastName:'Mustermann', email: 'mustermann@test.com', company:'Test', country:'DE'},
            {id: 2, firstName:'Muster', lastName:'Mustermann', email: 'mustermann@test.com', company:'test', country:'DE'},
            {id:3, firstName:'Thomas', lastName:'Mustermann', email: 'mustermannt@tesrt.com', company:'test', country:'DE'}
        ];
          
        return persons;
      }
}

ฉันต้องการรับรายการบุคคลที่มีรหัส ('personID') ID บุคคลที่ฉันได้รับจาก Routeparam ฉันต้องการ foreach loop หรือไม่? แต่ฉันยังไม่พบวิธีแก้ปัญหานี้


11
คุณสามารถค้นหาองค์ประกอบโดย Id like this persons.find (person => person.id === personId)
tstellfe

เป็นไปได้ที่จะทำซ้ำของFind object โดย id ในอาร์เรย์ของวัตถุ JavaScript
Igor

คำตอบ:


256

คุณต้องใช้วิธีการArray.filter:

this.persons =  this.personService.getPersons().filter(x => x.id == this.personId)[0];

หรือ Array.find

this.persons =  this.personService.getPersons().find(x => x.id == this.personId);

2
@SaravananNandhan วิธีการthis.personService.getPersons()ส่งคืนundefined
Andrei Zhytkevich

4
@AndreiZhytkevich เราไม่ควรใช้ triple เท่ากับ?
antonioplacerda

@antonioplacerda ใช่ว่าจะทำ อย่างไรก็ตามสำหรับคำถามนี้ไม่สำคัญเกินไป
Andrei Zhytkevich

1
ในตอนแรกรหัสนั้นดูเหมือนเป็นความลับสำหรับฉัน แต่อาจช่วยในการอ่าน "find (x => x.id == this.personId" เป็น "find x โดยที่รหัสของ x เท่ากับ id ของบุคคลนี้" ฉันไม่รู้เกี่ยวกับสิ่งอื่น ผู้คน แต่สำหรับฉันมันจำง่ายกว่ามาก
Rizki Hadiaturrasyid

70

สมมติว่าฉันมีอาร์เรย์ด้านล่าง:

Skins[
    {Id: 1, Name: "oily skin"}, 
    {Id: 2, Name: "dry skin"}
];

หากเราต้องการรับไอเทมด้วยId = 1และName = "oily skin"เราจะลองดังต่อไปนี้:

var skinName = skins.find(x=>x.Id == "1").Name;

ผลลัพธ์ที่ได้จะกลับมาที่ skinName คือ "ผิวมัน"

โปรดลองใช้ขอบคุณและเคารพ!

ใส่คำอธิบายภาพที่นี่


4
ขอขอบคุณสำหรับข้อมูลโค้ดนี้ซึ่งอาจให้ความช่วยเหลือระยะสั้นที่ จำกัด คำอธิบายที่เหมาะสมจะช่วยเพิ่มมูลค่าในระยะยาวได้อย่างมากโดยแสดงให้เห็นว่าเหตุใดจึงเป็นวิธีแก้ปัญหาที่ดีและจะทำให้มีประโยชน์มากขึ้นสำหรับผู้อ่านในอนาคตที่มีคำถามอื่น ๆ ที่คล้ายคลึงกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงสมมติฐานที่คุณตั้งขึ้น
Toby Speight

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

สวัสดี @rey_coder ฉันคิดว่าเราควรตรวจสอบว่าอาร์เรย์ไม่เป็นโมฆะก่อนที่เราจะนำไปใช้เพื่อรับรายการองค์ประกอบของอาร์เรย์ ชอบ: testArray = []; testArrayItem = testArray.length> 0? testArray.find (x => x.Id == 1) .Name: 'testArray null'; console.log (testArrayItem);
Hai Dinh

1
สวัสดี @ hai-dinh ที่จัดเรียงปัญหา ขอบคุณ
rey_coder

9

แปลงโครงสร้างข้อมูลเป็นแผนที่หากคุณใช้การค้นหานี้บ่อยครั้ง

mapPersons: Map<number, Person>;

// prepare the map - call once or when person array change
populateMap() : void {
    this.mapPersons = new Map();
    for (let o of this.personService.getPersons()) this.mapPersons.set(o.id, o);
}
getPerson(id: number) : Person {
    return this.mapPersons.get(id);
}

8

ตัวเลือกที่ยังไม่ได้กล่าวถึงคือการใช้ร่วม.findกับฟังก์ชันลูกศรและการทำลายโครงสร้าง นำตัวอย่างนี้จาก MDN

const inventory = [
  {name: 'apples', quantity: 2},
  {name: 'bananas', quantity: 0},
  {name: 'cherries', quantity: 5}
];

const result = inventory.find( ({ name }) => name === 'cherries' );

console.log(result) // { name: 'cherries', quantity: 5 }

5

จาก TypeScript คุณสามารถใช้วิธีการกรองอาร์เรย์ JS ดั้งเดิม ():

let filteredElements=array.filter(element => element.field == filterValue);

ส่งคืนอาร์เรย์ที่มีเฉพาะองค์ประกอบที่ตรงกันจากอาร์เรย์เดิม (0, 1 หรือมากกว่า)

อ้างอิง: https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/filter



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