Destrukturyzacja tablicy i obiektu z aliasem w jednej linii

Destrukturyzacja tablicy i obiektu z aliasem w jednej linii
logimw
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 2 lata
  • Postów:24
0

Siema,

mam takie pytanie w kwestii pedantyczności kodu.

Mam zwrotkę JSON i niestety główna informacja jest zwracana jako tablica z jednym elementem (pierwsza linia). Owy pierwszy (zerowy) element tablicy jest obiektem, a więc w drugiej linii wyciągam z tego obiektu obiekt attributes i nadaję mu alias product. Gdyby nie to, że jest tam tablica byłoby to zapisane w jedną linią i stąd pytanie, czy dałoby radę zapisać to ze wszystkimi destrukturyzacjami i aliasem w jednej linii.

Czy poniższy zapis da się skrócić do jednej linii?

Kopiuj
  const [productInfo] = props.productData.data;
  const { attributes: product } = productInfo;
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:28 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
1

A nie można:

Kopiuj
const { attributes: product } =  props.productData.data[0]

?

Update @LukeJL zaorał XD


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
Xarviel
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 7 godzin
  • Postów:847
3

JavaScript pozwala nawet połączyć obie destrukturyzacje razem, ale taka kombinacja raczej jest rzadko stosowana

Kopiuj
const [{ attributes: product }] =  props.productData.data
edytowany 1x, ostatnio: Xarviel
logimw
Super, dzięki! Dokładnie o to mi chodziło.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:minuta
  • Lokalizacja:Laska, z Polski
  • Postów:10074
0
Xarviel napisał(a):

JavaScript pozwala nawet połączyć obie destrukturyzacje razem, ale taka kombinacja raczej jest rzadko stosowana

Kopiuj
const [{ attributes: product }] =  props.productData.data

Ło kurcze, faktycznie się da!

Powinni to jakoś nazwać, takie wyciąganie rzeczy ze struktury.

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:mniej niż minuta
  • Postów:8423
1
logimw napisał(a):

Czy poniższy zapis da się skrócić do jednej linii?

Kopiuj
  const [productInfo] = props.productData.data;
  const { attributes: product } = productInfo;

Tak. Po prostu przestajesz kombinować jak koń pod górkę i piszesz to normalnie i jest w jednej linijce:

Kopiuj
const product = props.productData.data[0].attributes;

Owy pierwszy (zerowy) element tablicy jest obiektem, a więc w drugiej linii wyciągam z tego obiektu obiekt attributes i nadaję mu alias product.

No to przecież dokładnie to robi linijka wyżej. Destrukturyzacja ci nie potrzebna do tego.

Xarviel napisał(a):
Kopiuj
const [{ attributes: product }] =  props.productData.data

Ciekawe, nie znałem takiej kombinacji (albo: nie wpadłem). Ale i tak jest to dłuższy kod niż bez destrukturyzacji. I odrobinę mniej czytelny. Co prawda tutaj nie ma tragedii, ale widziałem już kody, gdzie ludzie już szaleli z tą destrukturyzacją, gdzie kod stawał się totalnie nieczytelny, a korzyści zero.

Z destrukturyzacją często można coś skrótowo zapisać:

Kopiuj
const { a, b } = o;
const [foo, setFoo] = useState(123);

zamiast:

Kopiuj
const a = o.a;
const b = o.b;
const state = useState(123);
const foo = state[0];
const setFoo = state[1];

ale to nie znaczy, że trzeba ją wszędzie wrzucać.


edytowany 3x, ostatnio: LukeJL
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 7 godzin
1
Xarviel napisał(a):
Kopiuj
const [{ attributes: product }] =  props.productData.data

jak się bawić to się bawić:

Kopiuj
const {productData: {data: [{ attributes: product }]}} = props

"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 1x, ostatnio: obscurity
Xarviel
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 7 godzin
  • Postów:847
1
obscurity napisał(a):

jak się bawić to się bawić:

Kopiuj
const {productData: {data: [{ attributes: product }]}} = props

Zabawa dopiero się rozkręca jak dodamy domyślne wartości na wypadek gdyby czegoś brakowało :D :D :P

Kopiuj
const {
  productData: {
    data: [
      { 
        attributes: product = "hello" 
      } = {}
    ] = []
  } = {}
} = {}

console.log(product) // hello
edytowany 2x, ostatnio: Xarviel
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:mniej niż minuta
  • Postów:8423
1
Xarviel napisał(a):

Zabawa dopiero się rozkręca jak dodamy domyślne wartości na wypadek gdyby czegoś brakowało :D :D :P

Jakby czegoś brakowało, to można:

Kopiuj
const defaultProduct = {foo: 123, bar: 456};
const product = props?.productData?.data?.[0]?.attributes ?? defaultProduct;

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator


edytowany 1x, ostatnio: LukeJL
Xarviel
No jasne, chciałem dalej pociągnąć przykład @obscurity, ale bardziej w formie żartu.
obscurity
tak to każdy umi

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.