Pobieranie konkretnego parametru z obiektu

0

Witajcie,
Nie wiem czy dobrze nazwałem temat ale postaram się dokładnie wszystko opisać. Mam funkcję w JS która wykonuje mi pewną operację. Dane do niej otrzymuje z systemu zewnętrznego w postaci 3 parametrów które są typu String. Po prostu w tamtym systemie wywołuję tą funkcję podając jej w parametrach 3 konkretne wartości. I działa. Chciałbym tą funkcję trochę zmodyfikować. Na jej wejściu dać obiekt biznesowy który składał będzie się właśnie z tych 3 parametrów które daję pojedynczo czyli zamiast zamiast robić

function(String1, String2, String3)

chcę dać

function(Object)

gdzie object wygląda następująco:
Object -->
String1
String2
String3

I teraz właśnie moje pytanie, w jaki sposób wewnątrz tej funkcji dostać się do konkretnego parametru z tego obiektu? Czyli jak pobrać np wartość parametru String1, String2, String3. Z góry dziękuję Wam za pomoc.
Pozdrawiam.

2
function myFunc( obj) {
var param1 = obj.string1;
var param2 = obj.string2;
var param3 = obj.string3;
//i dalej

}
//wywolanie

myFunc( { string1: 'aa', string2: 2, string3: 'xyz'});


0

Nie wiem czy się dobrze zrozumieliśmy ale ja nie rozumiem Twojego przykładu :). W Twoim przykładzie parametry String1, String2, String3 są inicjowane jakimiś wartościami. Natomiast mi chodzi o coś odwrotnego. Ja chcę przekazać typ złożony o nazwie object w którym mam zmienne String1, String2, String3 które mają już swoje wartości. To nie są puste parametry które ja muszę czymś zainicjować. To są parametry z konkretną wartością. Innymi słowy przekazuję typ złożony z 3 parametrów z czego każdy z nich ma swoją wartość. Teraz wewnątrz funkcji chcę pobrać te wartości parametrów z tego obiektu i wykonać odpowiednie działanie.

0

Chwilka... dokładnie to Ci pokazałem powyżej

0

Ok, przepraszam, mój błąd. Trochę nie zrozumiałem. Masz rację działa. Tylko jeszcze pytanie takie czysto poprawnościowe. Zrobiłem to w sposób następujący:

myFunc = function(object) {
     var param1 = objectString1;
     var param2 = objectString2;
     var param3 = objectString3;     
     if(//instrukcja) {
          return true
     }
     return false
}

I to jest spoko, działa prawidłowo. Tylko chodzi mi o to czy tak napisana funkcja jest poprawna? Czy aby było bardziej zgodnie ze sztuką nie powinienem tego rozbić na dwie funkcje do której przekazuję obiekt i zwracam konkretne wartości po czym wywołuję drugą funkcję która te wartości obramia wykonując odpowiednią instrukcję?

0
WielkiLew napisał(a):

Ok, przepraszam, mój błąd. Trochę nie zrozumiałem. Masz rację działa. Tylko jeszcze pytanie takie czysto poprawnościowe. Zrobiłem to w sposób następujący:

myFunc = function(object) {
     var param1 = objectString1;
     var param2 = objectString2;
     var param3 = objectString3;     
     if(//instrukcja) {
          return true
     }
     return false
}

I to jest spoko, działa prawidłowo. Tylko chodzi mi o to czy tak napisana funkcja jest poprawna? Czy aby było bardziej zgodnie ze sztuką nie powinienem tego rozbić na dwie funkcje do której przekazuję obiekt i zwracam konkretne wartości po czym wywołuję drugą funkcję która te wartości obramia wykonując odpowiednią instrukcję?

Dziwne, że działa bo powinno być raczej:

>      var param1 = object.String1;
>      var param2 = object.String2;
>      var param3 = object.String3;     

A co do zgodne ze sztuką... to zgodne ze sztuką byłoby przejście na TypeScript (przynajmniej).
Masz tam klasy itp. Ale jeżeli budujesz coś małego na swoje potrzeby i JS Ci wystarcza - to olej sztukę :-)

0

Nie no jasne, powinny być kropki. Nie kopiowałem tego tylko przepisałem bo kod mam na innym kompie :).

Sztuki nie oleję :). Co prawda robię to dla siebie ale dobre praktyki się przydają. Mógłbym trochę rozszerzyć temat o którym zacząłeś pisać? Chodzi o przejście na TypeScript. Co dokładnie masz na myśli? Ja oczywiście swoją drogą poczytam sobie o tym sam :)

1

Polecam użyć aktualnego standardu i napisać po prostu:

function myFunc({ objectString1, objectString2, objectString3 }) {
     return /* condition */
}

lub nawet:

const myFunc = ({ objectString1, objectString2, objectString3 }) => /* condition */
0

Ten literał w tym kontekście jest szczerze mówiąc dla mnie niezrozumiały.

function myFunc({ objectString1, objectString2, objectString3 })

ObjectString1, objectString2,... to są typy obiektowe, które definiuje wcześniej i podaję jako parametry do funkcji ?
Pytam, bo nie widzę w jaki sposób (chyba, że jest jakiś magiczny) mógłbym się odwołać po kluczu do wartości.
Będę wdzięczny za wyjaśnienie, ewentualnie jakiś pseudokod.

3

To się nazywa destructuring i taki zapis powoduje, że przekazany obiekt jest rozbijany od razu na zmienne odpowiadające polom obiektu, np:

function addObjectFields({ a, b }) {
  return a + b
}

// wywołanie
const myObject = {
  a: 1,
  b: 2,
}

const result = addObjectsFields(myObject) // -> 3

// czyli to odpowiednik funkcji:
function addObjectFields(obj) {
  const a = obj.a
  const b = obj.b
  
  return a + b
}

Czyli zapis: { objectString1, objectString2, objectString3 } oznacza tyle co "weź z przekazanego obiektu pola objectString1, objectString2 i objectString3 i przypisz je do lokalnych zmiennych o takich samych nazwach jak nazwy tych pól".

0

Super. Dzięki za wyjaśnienie.

0

Świetna sprawa, dzięki @Maciej Cąderek!

1 użytkowników online, w tym zalogowanych: 0, gości: 1