• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Filtrowanie obiektów w tablicach / szukanie określonych obiektów.

+1 głos
1,006 wizyt
pytanie zadane 13 lipca 2018 w JavaScript przez MrxCI Dyskutant (8,260 p.)

Witam,

mam taki kod który tworzy tablicę obiektów z 4 obiektami:

object_table = [];


class entity {
  constructor(a,b,c) {
    this.imie = a;
	this.nazwisko = b;
	this.wiek = c;
  }
}


object_table.push(
new entitty(
                  `Andrzej`,
                  `Kowalski`,
                  20
                  ));


object_table.push(
new entitty(
                  `Mateusz`,
                  `Kowalski`,
                  30
                  ));

object_table.push(
new entitty(
                  `Mariusz`,
                  `Kowalski`,
                  40
                  ));

object_table.push(
new entitty(
                  `Henry`,
                  `przykładowy`,
                 15
                  ));

Obiekty mają następujące numery w tablicy: 0,1,2 oraz 3.

Przykładowo, jak najoptymalniej wyszukać:

1. ID obiektów w tablicy których wartość "wiek" jest większa lub równa 30.

2. ID obiektów w tablicy których nazwisko jest różne od "kowalski"

3. ID obiektów w tablicy którzy mają wiek niższy lub równy 30 oraz nazwisko "kowalski"

 

Byłbym ekstremalnie wdzięczny za pokazanie przykładu aby wykonać powyższe czynności.

 

Pozdrawiam i z góry dziękuje za odpowiedzi!

1 odpowiedź

+1 głos
odpowiedź 13 lipca 2018 przez ScriptyChris Mędrzec (190,170 p.)
wybrane 13 lipca 2018 przez MrxCI
 
Najlepsza

Zakładam, że te trzy przypadki chcesz rozpatrywać oddzielnie.

Do ogarnięcia wymienionych trzech przypadków możesz posłużyć się metodami Array.prototype.filter oraz Array.prototype.map. Najpierw otrzymasz odfiltrowane tablice, zawierające pełne obiekty, a po użyciu map dostaniesz tablice tylko z identyfikatorami. Można alternatywnie pokusić się o skorzystanie z wyłącznie Array.prototype.reduce, gdzie jako wartość inicjacyjną przekażesz pustą tablicę.

Co do pseudo algorytmu. Z callbacków przekazywanych do metody filter zwracaj w kolejnych wywołaniach (czyli trzy razy skorzystaj z tej metody, osobno dla każdego przypadku) te obiekty, których: wiek >= 30, nazwisko !== 'kowalski', wiek <= 30 && nazwisko === 'kowalski'. Następnie na zwróconych tablicach użyj map i zwracaj po prostu pole id każdego obiektu - tutaj możesz w zasadzie raz użyć map, tylko połącz wcześniej trzy odfiltrowane tablice w jedną za pomocą na przykład operatora spread.

Gdy będziesz mieć problemy, daj znać zamieszczając kod.


Na marginesie: 

object_table = [];

Zawsze deklaruj zmienne którymś ze słówek kluczowych var, let lub const.

Zrobiłeś literówki tworząc nowe obiekty tej klasy:

class entity {

vs

new entitty(
komentarz 13 lipca 2018 przez MrxCI Dyskutant (8,260 p.)

Obecnie posiadam takie rozwiązanie

 

function search(){

let id= [];

for(i=0;i<object_table.length;i++){
	
	if(object_table.age > 20 ){
	id.push(i);
	}
}

return id;
}

 

Lecz wydaje mi się ono strasznie nie optymalne, czytałem o filter i map napisanym przez ciebie i nie potrafię otworzyć powyższego rozwiązania za ich pomocą

komentarz 14 lipca 2018 przez ScriptyChris Mędrzec (190,170 p.)

Gdzie wywołujesz funkcję search?

Wydobyć identyfikatory obiektów (tyle, że Twoje obiekty ich nie mają, więc musisz je dodać, albo zwracaj sobie zamiast tego indeksy) na przykład dla przypadku pierwszego możesz w ten sposób:

const idsOfAgeAtLeastThirty = object_table.filter((object) => {
    return object.wiek >= 30;
}).map((ageAtLeastThirty, index) => {
    return ageAtLeastThirty.id; // Twoje obiekty akurat nie zawierają pola id, więc możesz tutaj zwrócić po prostu zmienną index, wtedy będziesz mieć przynajmniej indeksy odfiltrowanych obiektów
});

 

Podobne pytania

0 głosów
3 odpowiedzi 3,925 wizyt
pytanie zadane 23 lipca 2017 w JavaScript przez modest Nowicjusz (210 p.)
0 głosów
2 odpowiedzi 1,058 wizyt
0 głosów
1 odpowiedź 2,329 wizyt
pytanie zadane 28 sierpnia 2018 w C i C++ przez supergosc44 Początkujący (270 p.)

93,734 zapytań

142,671 odpowiedzi

323,293 komentarzy

63,295 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...