Zamiana enuma na liste obiektow

0

Mam enuma typu:

export enum BookLevel {
  PRIMARY_SCHOOL = 'Szkoła podstawowa',
  HIGH_SCHOOL = 'Szkoła średnia',
  STUDIES = 'Szkoła wyższa',
}

I chce go zamienic na liste obiektow jak nizej:

Object.entries(BookLevel)
    .map(([key, value], index) => ({
      index: index,
      label: value,
      value: key,
    }))

Niestety z jakiegos powodu zmienia kolejnosc itemow bo wynik wyglada tak:

screenshot-20240416032234.png

Ktos wie jak zachowac taka sama kolejnosc jak podana w enumie i czemu kolejnosc w map nie jest zachowana?

3

To cały kod? Odpaliłem to w TypeScript Playground (zakładam, że to TypeScript?) i "u mnie działa". Sprawdziłem też na kilku przeglądarkach.

Tym niemniej zawartość tej tablicy sugerowałaby, że to mogło się na późniejszym etapie pomieszać (skoro przypisana właściwość index jest zgodnie z oczekiwaniami). Nie sortujesz tego później w jakiś sposób?

1

Silniki JS nie gwarantują kolejności iterowania po kluczach w obiekcie. (może być tak że na V8 zadziała a na innym już nie).
Jeśli chcesz mieć zachowana kolejność musisz użyć listy.

2
szok napisał(a):

Silniki JS nie gwarantują kolejności iterowania po kluczach w obiekcie

To zależy od wersji ECMAScript. W ES2020 i wyżej powinno być to ujednolicone (https://stackoverflow.com/a/30919039), chociaż nadal poleganie na kolejności właściwości nie jest najlepszym pomysłem.

2

na MDN napisali: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries
The order of the array returned by Object.entries() is the same as that provided by a for...in loop.
z kolei w for..in:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
The traversal order, as of modern ECMAScript specification, is well-defined and consistent across implementations. Within each component of the prototype chain, all non-negative integer keys (those that can be array indices) will be traversed first in ascending order by value, then other string keys in ascending chronological order of property creation.

Czyli powinno być ujednolicone.

Ale ten output z konsoli wygląda tak, jakby coś jeszcze mieszało z tą tablicą na samym końcu, po funkcji map (czy to cały kod?).

0

Tak caly:
screenshot-20240416135821.png

Nawet jak dodam

res.sort((a, b) => b.index - a.index)

to i tak kolejnosc sie nie zmienia

2

OK moj blad, jednak dane byly sortowane pozniej xd Ale do tej pory myslalem ze console.log mi wyprintuje wartosc zmiennej dokladnie w tym momencie a tutaj widze jednak bierze pod uwage nawet pozniejsze manipulacje zmienna

0

Posortuj po index po prostu, jeśli koniecznie chcesz zachowaną kolejność.

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