Angular 2 TypeScript, Array'de öğe bulma


131

Bir Bileşenim ve Hizmetim var:

Bileşen:

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

Hizmet:

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

Kimliğe ('personID') sahip Kişi Öğesini almak istiyorum. Routeparam'dan aldığım kişi kimliği. Bunun için foreach döngüsüne ihtiyacım var? Ama bunun için bir çözüm bulamadım.


11
Bu persons.find (kişi => person.id === personId)
tstellfe

Yanıtlar:


255

Yöntemi kullanmanız gerekir Array.filter:

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

veya Array.find

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

2
@SaravananNandhan, yöntem this.personService.getPersons()geri dönüyorundefined
Andrei Zhytkevich

4
@AndreiZhytkevich üçlü eşitler kullanmamalı mıyız?
antonioplacerda

@antonioplacerda, evet, bu yeterli. Ancak bu soru için çok önemli değil.
Andrei Zhytkevich

1
İlk başta bu kod benim için şifreli görünüyor, ancak "find (x => x.id == this.personId" ifadesini "bul x, burada x'in kimliği bu kişi kimliğine eşittir" şeklinde okumak yardımcı olabilir. insanlar, ama benim için bunu hatırlaması çok daha kolay.
Rizki Hadiaturrasyid

70

Aşağıdaki diziye sahip olduğumu varsayalım:

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

Biz öğeyi almak istiyorsanız Id = 1ve Name = "oily skin", Biz aşağıda çalışacağım:

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

Sonuç, skinName değerini "Yağlı cilt" olarak döndürür.

Lütfen bir deneyin, teşekkürler ve saygılarımla!

görüntü açıklamasını buraya girin


4
Kısa vadeli sınırlı yardım sağlayabilecek bu kod parçacığı için teşekkür ederiz. Uygun bir açıklama , bunun neden soruna iyi bir çözüm olduğunu göstererek uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer sorularla gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar da dahil olmak üzere bazı açıklamalar eklemek için lütfen cevabınızı düzenleyin .
Toby Speight

1
Bunu başlangıçta boş, sonra dinamik olarak doldurulmuş bir dizi için nasıl yapardınız ... derleme sırasında bir sorun var gibi görünüyor .... özellik, örneğin Id bilinmez hale geliyor.
rey_coder

Merhaba @rey_coder, dizinin eleman öğelerini almak için uygulamadan önce dizinin boş olup olmadığını kontrol etmemiz gerektiğini düşünüyorum. Gibi: testArray = []; testArrayItem = testArray.length> 0? testArray.find (x => x.Id == 1) .Name: 'testArray null'; console.log (testArrayItem);
Hai Dinh

1
Merhaba @ hai-dinh, Bu sorunu çözdü. Teşekkürler.
rey_coder

9

Bu aramayı sık kullanıyorsanız veri yapısını haritaya dönüştürün

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

Henüz belirtilmeyen temiz bir seçenek .find, ok işlevleriyle birleştirmek ve yıkıcı kullanmaktır. Bu örneği MDN'den alın .

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

Hizmetinizde bu kodu kullanın:

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

1

Bunu dene

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

      console.log('Description : ', val );
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.