Jak posortować słownik z instancjami klasy?

0

Pisze w TypeScript.

Mam sobie instancje jakiejś klasy w dictionary, której instancje maja pole getRatio cos w stylu:

export class Step{

    public _price:number = 5;
    private _depth20Asks:number;
    private _depth20Bids:number;

     constructor()
    {

    }

     public get depth20Asks():number
    {
        return this._depth20Asks;
    }

    public set depth20Asks(val:number)
    {
        this._depth20Asks = val;
    }

    public get depth20Bids():number
    {
        return this._depth20Bids;
    }

    public set depth20Bids(val:number)
    {
        this._depth20Bids = val;
    }

    public get bidsByAsksRatio():number
    {
        return this._depth20Bids/this._depth20Asks;
    }

Wczesniej ustalam sobie wszystkie liczby kiedy tworze instancje i wrzucam to do dictionary gdzieś w jakiejś innej klasie:

export class foo {

private _possibleStepsDictionary:{[name:string]:Step} = {};

...
this._possibleStepsDictionary[name] = s;

}

I teraz chciałbym posortowacć nowy object po tej liczbie, ktora zwraca metoda public get bidsByAsksRatio():number wiec robie cos takiego:

const sorted_object = Object.fromEntries(
    Object.entries(this._possibleStepsDictionary).sort(([,a],[,b]) => { b.bidsByAsksRatio - a.bidsByAsksRatio})
)

Nie sortuje :/ Nawet jak ustawie sobie pole _price jako public i zrobię:

const sorted_object = Object.fromEntries(
    Object.entries(this._possibleStepsDictionary).sort(([,a],[,b]) => { b._price - a._price})
)

Dalej nie sortuje:/ Nie chce tego wrzucac do zwyklej tablicy bo zrobi mi się bajzel, chce mieć posortowane w key=>val dictionary ale cos nie idzie.

Jakies pomysly?

1
goku21 napisał(a):

Dalej nie sortuje:/ Nie chce tego wrzucac do zwyklej tablicy bo zrobi mi sie bajzel, chce miec posortowane w key=>val dictionary ale cos nie idzie. Jakies pomysly?

Mało rozumiem z tego kodu i mało znam TSa ale chyba się tam nie da bo domyślny słownik (Mapa?) w JSie (TSie) to hash słownik i nie zna pojecia porzadku wewnętrz siebie? Potrzebowałbyś tree słownika (jest coś takiego dla JSa/TSa w ogóle?)

UPDATE o prosze, jest coś takiego https://www.npmjs.com/package/ts-treemap

3

Do posortowania obiektu wykorzystałbym Map, ponieważ zwykły obiekt nie musi gwarantować, że zachowa kolejność dodania właściwości i zależy to od środowiska (Node.js, silnik przeglądarki Chrome, silnik przeglądarki Firefoxa itd).

Bazując na takim przykładzie

class Example {
  constructor(public value: number) {
    this.value = value;
  }
}

const dictionary = {
  bar: new Example(10), // { value: 10 }
  foo: new Example(5), // { value: 5 } 
};

Skorzystanie z Object.entries stworzy nam taką tablicę

[
  ['bar', { value: 10 }],
  ['foo', { value: 5 }],
];

i żeby posortować to rosnąco wykorzystujemy obiekt Map, oraz metodę sort

const sortedDictionary = new Map(Object.entries(dictionary).sort((itemA, itemB) => {
  return itemA[1].value - itemB[1].value;
}));
0

Jaki jest sens sortowania struktury klucz - > wartość?

1
FrontendGuy napisał(a):

Jaki jest sens sortowania struktury klucz - > wartość?

Np gdy iterujesz po strukturze klucz wartość (zwanej w np w Javie Map) to dostajesz pary w porostowanej kolejności. W Javie jest na to navet osobny interfejs SortedMap

1
FrontendGuy napisał(a):

Jaki jest sens sortowania struktury klucz - > wartość?

Chcesz, żeby output był deterministyczny np. do testów, albo jak chcesz zrobić diffa. Zazwyczaj prościej jest doprowadzic output do deterministycznej formy niż napisać asercję, która jest czytelna, prosta i olewa kolejność

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