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

this nie wskazuje na to co chce

Fiszki IT
Fiszki IT
0 głosów
206 wizyt
pytanie zadane 1 listopada 2017 w JavaScript przez Marchiew Mądrala (6,860 p.)

Cześć, może głupie pytanie, ale nie mogę sobie poradzić. Mam coś takiego:

Array.prototype.count = function(a = null) {
    let e = [];

    if(a !== null) {
        ...
    }
    else {
        e = this.forEach(function(g) {
                this.count(g);

            // console.log(g);
        });

        return e;
    }
}

i niestety wyświetla mi komunikat, że "this.count nie jest funkcją" przy this.count(g) w forEachu.

Jak mogę to naprawić? Chce, żeby to this wskazywało na tablicę do której przypiszę tę metodę, a nie jej elementu "g" lub czegokolwiek innego.

komentarz 4 listopada 2017 przez Marchiew Mądrala (6,860 p.)

No właśnie wiem, że namieszałem haha

Chciałbym utworzyć taką strukturę mniej więcej:

[
   0: ["cos": 2],
   1: ["aha": 3],
   2: ["mleko": 1]
]

Jeśli ma to sens oczywiście, ale na chwilę obecną na nic lepszego nie wpadłem. Kombinuję z pushem:

for(let i=0, j=self.length; i<j; ++i) {
                if(e.count(self[i]) < 1) {
                    e.push( self[i] );

                    console.log( self[i] + ": " + self.count(self[i]) );
                }
            }

i po wyświetleniu w pętli zgadza się:

Nie umiem tego przełożyć na strukturę, którą naskrobałem haha ale debil ze mnie. Biorę się za coś czego nie potrafię zrobić.

 

komentarz 4 listopada 2017 przez ScriptyChris Mędrzec (164,460 p.)
[
   0: ["cos": 2],
   1: ["aha": 3],
   2: ["mleko": 1]
]

Popełniasz ten sam błąd: ["cos": 2] to tablica z błędnym indeksem elementu - jeśli chcesz propertisy z kluczami jako string, to zamiast tablicy powinien być tu obiekt, czyli { "cos": 2 }. Możesz oczywiście iterować po tablicy (a konkretnie po jej propertisach - czyli własnościach, które posiadają obiekty w JavaScript), gdzie indeksami nie są liczby (do tego służy pętla for..in), ale to nie jest naturalne przeznaczenie tablic.

komentarz 4 listopada 2017 przez Marchiew Mądrala (6,860 p.)

Kurde.

zostaje tylko coś takiego:

[
    0: [
        0: "cos",
        1: 2
    ],

    1: [
        0: "aha",
        1: 3
    ],

    2: [
        0: "mleko",
        1: 1
    ]
]
           

Burzy to mają koncepcję tego, żeby była możliwość posortowania jej alfabetycznie malejąco lub rosnąco albo od największej ilości powtórzeń lub najmniejszej. Trudno i tak jak to wyjdzie to będę zadowolony

EDIT: Można by było pokusić się o zwracanie obiektu, ale nie umiem na nich operować i chyba nie ma tak dużych możliwości jak z tablicami

1
komentarz 4 listopada 2017 przez ScriptyChris Mędrzec (164,460 p.)

Tablica obiektów będzie tutaj ok. Napisałem Ci przykładowy kod na sortowanie rosnące wg alfabetu lub liczby (ustalasz to przez parametr).

Przykładowa struktura:

var structure = [
    { 'cos': 2 },
    { 'aha': 3 },
    { 'mleko': 1 }
];

Funkcje sortujące (tzn. jedna sortuje, a druga rozpakowuje):

function sortStructure( structure, valueType ) { // parametr pierwszy to struktura w formie TABLICY, drugi parametr to typ w postaci stringa (nazywasz słownie "string" lub "number")
	const destructObject = destructByType( valueType ); // przekazujesz typ, otrzymujesz funkcję rozpakowującą z zapamiętanym typem

	return structure.sort( ( currentValue, nextValue ) => {
		const currentValueSortable = destructObject( currentValue ); // przekazujesz obiekt, otrzymujesz rozpakowany klucz lub wartość (w zależności czy chcesz alfabetycznie - klucz, czy numerycznie - wartość)
		const nextValueSortable = destructObject( nextValue ); // j.w.

		if ( currentValueSortable < nextValueSortable ) {
			return -1;
        } else if ( currentValueSortable > nextValueSortable ) {
			return 1;
        }

		return 0;		
    } );
}

function destructByType( type ) { // argumentem <type> powinno być słowne określenie typu wartości - "number", albo "string"
    return ( obj ) => {
        const key = Object.keys( obj )[ 0 ]; // jako, że w Twojej strukturze, obiekty mają jeden property, to pobiera jedyny klucz

        return type === 'string' ? key : obj[ key ]; // jeśli typem jest string, zwraca klucz obiektu, a jesli co innego (czyli np. number) to zwraca wartość
    }
}

Użycie:

sortStructure( structure, 'string' ); // struktura posortowana alfabetycznie
sortStructure( structure, 'number' ); // struktura posortowana numerycznie

Możesz podpiąć funkcję sortStructure pod Array.ptototype, żeby działało na każdej tablicy. Jako ćwiczenie, możesz doimplementować sortowanie malejące i ewentualnie jakieś inne typy danych :)

komentarz 4 listopada 2017 przez Marchiew Mądrala (6,860 p.)
Takiej odpowiedzi to się nie spodziewałem. Żeś mnie zaskoczył. Dzięki wielkie za wszelkie wyjaśnienia, podpowiedzi i starania. Postaram się już nie pytać o pierdoły haha. Bardzo dużo mi i tak pomogłeś.

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

Podobne pytania

0 głosów
0 odpowiedzi 224 wizyt
0 głosów
3 odpowiedzi 165 wizyt
pytanie zadane 26 października 2018 w JavaScript przez turtelian Obywatel (1,770 p.)
+2 głosów
3 odpowiedzi 555 wizyt
pytanie zadane 4 czerwca 2015 w Java przez Dissio Mądrala (5,830 p.)
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

84,751 zapytań

133,554 odpowiedzi

295,978 komentarzy

56,010 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...