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

Argument z funkcji jako własność tablicy

Object Storage Arubacloud
+1 głos
155 wizyt
pytanie zadane 19 stycznia 2021 w JavaScript przez Kazek Początkujący (460 p.)

Mam listę użytkowników i chcę zrobić funkcję, która będzie logować użytkownika jeżeli znajdzie odpowiadającą mu wartość własności.

const userList2 = [
    user1 = {
        login: 'user1',
        email: 'user1@wp.pl',
        password: 'password1',
        address: 'owocowa1',
        profilePhotoLink: 'https://link1.com'
    },
    user2 = {
        login: 'user2',
        email: 'user2@wp.pl',
        password: 'password2',
        address: 'owocowa2',
        profilePhotoLink: 'https://link2.com'
    }
]

i metoda

const findByProperty = (prop, value) => {
    for (const user in userList2) {
        if (userList2.hasOwnProperty(user)) {
            for (const val in userList2[user]) {
                if (Object.prototype.hasOwnProperty.call(userList2[user], val) && userList2[user].prop === value) {
                    console.log(userList2[user])
                    break;
                }
            }
        }
    }
}

Czyli jako prop podaję na przykład email, a value to na przykład user2@wp.pl

I pojawia się problem w tej linijce 

if (Object.prototype.hasOwnProperty.call(userList2[user], val) && userList2[user].prop === value)

Mianowicie, jak przypisać(?) ten prop to userList2[user]? Próbowałem arguments[0], ale też nie działa, z ${prop} to samo. Nie chcę robić osobnej metody dla każdej z możliwych properties.

komentarz 19 stycznia 2021 przez Tomek Sochacki Ekspert (227,510 p.)

strasznie masz zamotaną tą funkcję... rozumiem, że biznesowo przychodzi Ci do funkcji X lista z następującym interfejsem:

interface User {
        login: string,
        email: string,
        password: string,
        address: string,
        profilePhotoLink: string
    }

i teraz mamy listę:
const users: User[] = ...

jeśli tak, to napisz biznesowo co chcesz dokładnie uzyskać i dopiero wtedy wejdziemy w implementację, najpierw poznajmy założenia biznesowe problemu.

komentarz 19 stycznia 2021 przez Kazek Początkujący (460 p.)

Tak, do funkcji przychodzi mi cała lista.

W funkcji chcę przeszukiwać tę listę użytkowników po wybranym property i wartości tego property i końcowo zwrócić użytkownika bądź listę użytkowników, którego/ których wartości property zgadzają się z podanym jako argument.

przykładowy wynik z przykładu podanego w pytaniu: 

{
        login: 'user2',
        email: 'user2@wp.pl',
        password: 'password2',
        address: 'owocowa2',
        profilePhotoLink: 'https://link2.com'
 }

 

komentarz 19 stycznia 2021 przez icytower Bywalec (2,110 p.)

1. użytkownicy są w tablicy, więc użyj array methods w tej serii na yt masz pięknie opowiedziane o wszystkich, to mocno ułatwia pracę i sprawia, ze Twój kod jest czytelniejszy.
2. jeśli dobrze rozumiem to funkcja ma wyjmować z tablicy użytkowników, którzy mają wartość X w property Y. X i Y mają być podane w argumentach funkcji. tak?

komentarz 19 stycznia 2021 przez Kazek Początkujący (460 p.)
tak, dokładnie
2
komentarz 19 stycznia 2021 przez Tomek Sochacki Ekspert (227,510 p.)

a nie lepiej zrobić to funkcją skrojoną konkretnie pod ten typ obiektów? Nie jestem zwolennikiem robienia maksymalnie uniwersalnych rozwiazan, są one trudne w utrzymaniu i analizie. Oczywiście co innego jak np. robimy jakąś libkę itp, ale wewnętrznie w apce raczej preferuję konkretne funkcje, np. chcemy userów, którzy mają konkretną wartość pola email, czyli robimy:

function getUsersWithDefinedEmail(users, email) {
  return users.filter(user => user.email === email);
}

takie coś znacznie łatwiej się czyta, od razu wiesz co i jak. Pytanie dlaczego chcesz zrobić rozwiązanie maksymalnie uniwersalne, zamiast takiego prostego?

komentarz 19 stycznia 2021 przez Kazek Początkujący (460 p.)
okej, w takim razie postawię na takie rozwiązanie :)
chciałem zrobić uniwersalne rozwiązanie, żeby trochę zaoszczędzić na kodzie, bo wiadomo, że w razie gdybym powiększył userów o kolejne property, to znowu muszę pisać kolejną metodę
dziękuję za poświęcony czas
2
komentarz 19 stycznia 2021 przez Tomek Sochacki Ekspert (227,510 p.)

ja podchodzę do takich problemów tak - jeśli obecnie jest to tylko jedno property to lepiej zrobić konkretną metodę, jasno nawet swoją nazwą wskazującą co i jak.

Jeśli doszło by drugie/trzecie property to można by zrobić np. jakiś builder, który wykorzystywałby trzy pojedyncze metody sprawdzające konkretne property (i swoimi nazwami mówiące co analizujemy).

Jeśli miałbyś mieć tego jeszcze więcej to najpierw, zamiast robić mocno uniwersalną funkcję zastanowiłbym się, czy na pewno dobrze podchodzimy do całego problemu... czy może takie filtrowania, walidacje itp. nie powinny być rozrzucone na inne poziomy itp.

Jeśli ostatni punkt nadal wskazuje na rozwiązanie o jakim tu mówimy w tym wątku to dopiero to jest miejsce na stworzenie tak uniwersalnej metody.

Ewentualnie, gdybyś potrzebował np. reużyć ten sam mechanizm filtrowania/walidacji itp. na róznych zbiorach danych... ale wtedy podszedłbym do tego inaczej:

// jakiś uniwersalny util:
getFilteredItems(items, conditions) {}

// w miejscu filtrowania userow:
getUsersWithDiscounts(users) {
  return getFilteredItems(users, jakies-warunki-rabatowe);
}

czyli opakowałbym wywołanie uniwersalnego utilsa w dodatkową funkcję/metodę której nazwa jasno wskaże co chcemy zrobić.

Także jak widzisz nie ma uniwersalnej odpowiedzi na Twoje pytanie, wszystko zależy od przypadku :) ale generalnie nei staraj się na siłę robić super uniwersalnych rozwiązań jeśli aplikacja tego nie wymaga. Lepiej zrobić w razie czego refactoring niż od razu iść w mega uniwersalizm, optymalizacje itp.

I taka uwaga na koniec - po napisaniu jakiegoś kodu zastanów się, na ile jest on wg Ciebie czytelny dla nowej osoby, która wchodzi dopiero w dany projekt i nie zna dobrze domeny, wszystkich założeń biznesowych itp. Czy jest w stanie się w miarę w nim ogarnąć.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 563 wizyt
–1 głos
1 odpowiedź 3,963 wizyt
pytanie zadane 7 sierpnia 2017 w C i C++ przez Partyjny Obywatel (1,170 p.)
0 głosów
1 odpowiedź 607 wizyt
pytanie zadane 6 kwietnia 2018 w JavaScript przez JSJerry Początkujący (260 p.)

92,568 zapytań

141,422 odpowiedzi

319,637 komentarzy

61,956 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!

...