Angular 2 TypeScript cách tìm phần tử trong Array


131

Tôi có Thành phần và Dịch vụ:

Thành phần:

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);  
        }
}

Dịch vụ:

@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;
      }
}

Tôi muốn nhận Mục Người với Id ('personID'). Cá nhân tôi nhận được từ Routpayam. Cho rằng tôi cần vòng lặp foreach? Nhưng tôi đã tìm thấy một giải pháp cho việc này.


11
Bạn có thể tìm thấy một yếu tố theo Id như người này.find (person => person.id === personId)
tstellfe

Câu trả lời:


255

Bạn cần sử dụng phương pháp Array.filter:

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

hoặc là Array.find

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

2
@SaravananNandhan, phương thức this.personService.getPersons()trả vềundefined
Andrei Zhytkevich

4
@AndreiZhytkevich chúng ta không nên sử dụng ba bằng?
antonioplacerda

@antonioplacerda, vâng, điều đó sẽ làm. Tuy nhiên, đối với câu hỏi này nó không quá quan trọng.
Andrei Zhytkevich

1
Lúc đầu, mã đó có vẻ khó hiểu đối với tôi, nhưng nó có thể giúp đọc "find (x => x.id == this.personId" là "find x, trong đó id của x bằng id người này" Tôi không biết về người khác mọi người, nhưng đối với tôi điều này dễ nhớ hơn nhiều
Rizki Hadiaturrasyid

69

Giả sử tôi có mảng dưới đây:

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

Nếu chúng tôi muốn nhận vật phẩm bằng Id = 1Name = "oily skin", Chúng tôi sẽ thử như sau:

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

Kết quả sẽ trả về skinName là "Da nhờn".

Hãy thử, Cảm ơn và trân trọng!

nhập mô tả hình ảnh ở đây


4
Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp ngắn hạn có giới hạn. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
Toby Speight

1
Làm thế nào bạn sẽ làm điều này cho một mảng ban đầu trống sau đó được điền động ... dường như có một vấn đề trong khi biên dịch .... thuộc tính ví dụ Id trở nên không xác định.
rey_coder

Xin chào @rey_coder, tôi nghĩ rằng chúng ta nên kiểm tra nếu mảng không null trước khi chúng ta triển khai để lấy các mục phần tử của mảng. Giống như: testArray = []; testArrayItem = testArray.length> 0? testArray.find (x => x.Id == 1) .Name: 'testArray null'; console.log (testArrayItem);
Hải Đình

1
Hi @ hai-dinh, Điều đó đã sắp xếp vấn đề. Cảm ơn.
rey_coder

9

Chuyển đổi cấu trúc dữ liệu thành bản đồ nếu bạn thường xuyên sử dụng tìm kiếm này

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

Một tùy chọn gọn gàng chưa được đề cập là sử dụng kết hợp .findvới các chức năng mũi tên và phá hủy. Lấy ví dụ này từ 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 }


4

Sử dụng mã này trong dịch vụ của bạn:

return this.getReports(accessToken)
        .then(reports => reports.filter(report => report.id === id)[0]);

1

Thử cái này

          let val = this.SurveysList.filter(xi => {
        if (xi.id == parseInt(this.apiId ? '0' : this.apiId))
          return xi.Description;
      })

      console.log('Description : ', val );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.