• 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
917 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 3,544 wizyt
pytanie zadane 23 lipca 2017 w JavaScript przez modest Nowicjusz (210 p.)
0 głosów
2 odpowiedzi 971 wizyt
0 głosów
1 odpowiedź 2,158 wizyt
pytanie zadane 28 sierpnia 2018 w C i C++ przez supergosc44 Początkujący (270 p.)

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

62,787 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...