• 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.

Object Storage Arubacloud
+1 głos
815 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,190 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,190 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 2,874 wizyt
pytanie zadane 23 lipca 2017 w JavaScript przez modest Nowicjusz (210 p.)
0 głosów
2 odpowiedzi 663 wizyt
0 głosów
1 odpowiedź 1,820 wizyt
pytanie zadane 28 sierpnia 2018 w C i C++ przez supergosc44 Początkujący (270 p.)

92,551 zapytań

141,395 odpowiedzi

319,526 komentarzy

61,936 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...