Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Jak vrátit výsledek z funkce která volá sama sebe v JS

Ahoj, funkce vrací v poli vždy jen jedno číslo, nevíte proč?
Pokud nahradím arr.push(obj.parid); za console.log(obj.parid); vypíšou se všechny čísla. Jako by se to pole přepisovalo, nemůžu na to přijít. Díky
Dá se to vyřešit tím, že var arr=[], nastavím jako globální, ale fuj..

function test(id){
  var arr=[];
  array.forEach(function(obj){
    if(obj.catid===id){
      arr.push(obj.parid);
        arr.push(test(obj.parid));
    }
  });
  return arr;
}

test(452)
Předmět Autor Datum
A já si říkal, že je mi ten kód povědomý. Tohle jsi byl taky ty, že? https://pc.poradna.net/question…
Wikan 16.02.2023 12:30
Wikan
Asi jo, ale to není JS. Stejně nevidím tu chybu :)
Marek9 16.02.2023 12:36
Marek9
Asi jo? Já myslím, že ne asi, ale určitě, tak z nás laskavě nedělej blbce. Marek 9, Petr99, pman, JA…
host 16.02.2023 12:44
host
A pointa?
Marek9 16.02.2023 12:45
Marek9
Pointa pro blbé: že když se budeš ptát na to samé pod různými jmény, můžeš být zablokován.
host 16.02.2023 12:46
host
Odpověď pro blbé, jestli nevidíš rozdíl v dotazu tak se vrať do 1 první třídy, tam se učí číst. Více…
Marek9 16.02.2023 13:05
Marek9
Nehraj si na ukřivděnýho a začni se chovat normálně (tzn. slušně), jinak končíš. Nebudu se tady s te…
host 16.02.2023 13:38
host
Chovám se slušně, jen ty se chováš jako arogantní hulvát. Bez důvodu mě napadáš a vyhrožuješ mi, zne…
Marek9 16.02.2023 14:08
Marek9
Svý jsem ti už řekl, zařiď se podle toho jak uznáš za vhodné. Dál tady s tebou nebudu ztrácet čas ně…
host 16.02.2023 15:53
host
Slušné je používať jeden nick. Nie pri každej otázke vymýšľať nový. Je to dôkaz, že takto chceš okla…
yYy 16.02.2023 18:50
yYy
Podla mňa riešiť nicky na poradne, kde sa dá písať dotaz bez registrácie (účtu) je nezmysel, už len…
Ale 16.02.2023 18:53
Ale
Akorát tady znepřehledňuje vlákno arogantníma žvástama o ničem. Když procházím jiné vlákna, tak vidí… poslední
Marek9 18.02.2023 13:14
Marek9
No tak na první pohled jsou v tom kódu pro Python dva cykly, ty tu máš jeden.
Wikan 16.02.2023 12:48
Wikan
Ale to by nevracelo správný výsledek ani když by se to jen vypisovalo do console.log() a nefungovalo…
Marek9 16.02.2023 13:02
Marek9
Jaká do toho dáváš data? Co ta funkce má přesně dělat? A co je podle tebe správný výsledek?
Wikan 16.02.2023 13:22
Wikan
Klidně můžu dát ten vzor z PY data=[ {"catid":1,"parid":0,"text":"ide1/ide_rodice0"}, {"catid":2,"p…
Marek9 16.02.2023 13:38
Marek9
No jak jsem psal, chybí tam ten druhý cyklus: function test(id) { const arr = []; array.forEach((ob…
Wikan 16.02.2023 14:10
Wikan
Díky. Můžeš si prosím pustit tento kód a říct mi proč to funguje s jedním cyklem? data=[ {"catid":…
Marek9 16.02.2023 14:24
Marek9
Protože tam neplníš to pole.
Wikan 16.02.2023 14:30
Wikan
Tím se vysvětluje i to, proč to funguje s tím globálním polem. Můžeš mi objasni co ten druhý cyklus…
Marek9 16.02.2023 15:35
Marek9
test(obj.parid) vrátí pole .forEach((id) => arr.push(id)) to pole projde a každý prvek přidá do pole…
Wikan 16.02.2023 15:45
Wikan
Pole? obj.parid je přece číslo. Jak se z čísla stane pole?
Marek9 16.02.2023 15:53
Marek9
Co vrací funkce test? function test(id) { const arr = []; ... return arr; }
Wikan 16.02.2023 15:55
Wikan
Ano, máš pravdu, dopletl mě ten parametr ve funkci test. Moc děkuji za pomoc.
Marek9 16.02.2023 16:01
Marek9
Hodilo by se vidět i to pole, který má funkce test() procházet. Jinak mi to připadá jako nějaká reku…
Pavel 16.02.2023 20:48
Pavel
Aha, koukám, že už je to tu dávno vyřešeno. Měl jsem otevřenou neaktualizovanou záložku příliš dlouh…
Pavel 16.02.2023 20:51
Pavel

Chovám se slušně, jen ty se chováš jako arogantní hulvát. Bez důvodu mě napadáš a vyhrožuješ mi, zneužíváš práv administrátora, a to se mi vážně nelíbí!

Co z toho jsem porušil?

Provozovatel si vyhrazuje právo mazat/upravit příspěvky:
vulgární, rasistické nebo jinak urážlivé
sexuálně orientované
týkající se nelegálního software nebo jiných nezákonných aktivit
reklamního charakteru
odlišné od zaměření fóra
Provozovatel je oprávněn dočasně nebo trvale zablokovat účet uživatele, který poruší pravidla uvedená v tomto dokumentu.

Podla mňa riešiť nicky na poradne, kde sa dá písať dotaz bez registrácie (účtu) je nezmysel, už len preto že hocikto (trebárs i dajaký Dežo z Malaciek) môže používať stejný nick, tzv. nick nie je unikátny. Takže i tak v podstate není jasné či je to stejný človek, ak neporovnávaš IP čo je tiež len orientačné, keď niektorý operátory za NATom majú stejnú IP pre mnoho ľudí, nehovoriac o dynamických IP. Kým nick nie je unikátny identifikátor používateľa, tak je to ako hádzanie hrachu na stenu.

Klidně můžu dát ten vzor z PY

data=[
	{"catid":1,"parid":0,"text":"ide1/ide_rodice0"},
	{"catid":2,"parid":5,"text":"ide2/ide_rodice5"},
	{"catid":3,"parid":1,"text":"ide3/ide_rodice1"},
	{"catid":4,"parid":8,"text":"ide4/ide_rodice8"},
	{"catid":5,"parid":4,"text":"ide5/ide_rodice4"},
	{"catid":6,"parid":4,"text":"ide6/ide_rodice4"},
	{"catid":7,"parid":1,"text":"ide7/ide_rodice1"},
	{"catid":8,"parid":3,"text":"ide8/ide_rodice3"},
	{"catid":9,"parid":5,"text":"ide9/ide_rodice5"},
	{"catid":9,"parid":1,"text":"ide9/ide_rodice1"}
]

a výsledkem má být pole naplněné několika catid podle toho kolik má zadané id vnořených rodičů.
když zadám
test(9), očekývaný výsledek bude [1,0]
nebo
test(6), očekývaný výsledek bude [4,8,3,1,0]

nevím zda je to k pochopení.

Díky. Můžeš si prosím pustit tento kód a říct mi proč to funguje s jedním cyklem?


data=[
	{"catid":1,"parid":0,"text":"ide1/ide_rodice0"},
	{"catid":2,"parid":5,"text":"ide2/ide_rodice5"},
	{"catid":3,"parid":1,"text":"ide3/ide_rodice1"},
	{"catid":4,"parid":8,"text":"ide4/ide_rodice8"},
	{"catid":5,"parid":4,"text":"ide5/ide_rodice4"},
	{"catid":6,"parid":4,"text":"ide6/ide_rodice4"},
	{"catid":7,"parid":1,"text":"ide7/ide_rodice1"},
	{"catid":8,"parid":3,"text":"ide8/ide_rodice3"},
	{"catid":9,"parid":5,"text":"ide9/ide_rodice5"},
	{"catid":9,"parid":1,"text":"ide9/ide_rodice1"}
]

function test(id){
  data.forEach(function(obj){
    if(obj.catid===id){
      console.log(obj.parid)
      test(obj.parid)
    }
  });
}

test(6)

Tím se vysvětluje i to, proč to funguje s tím globálním polem.

Můžeš mi objasni co ten druhý cyklus přesně dělá?

test(obj.parid).forEach((id) => arr.push(id));
test má parametr id, forEach má parametr id a push plní pole id stejným jako má parametr ten forEach, nechápu to. Díky

Hodilo by se vidět i to pole, který má funkce test() procházet. Jinak mi to připadá jako nějaká rekurze, na řádku č. 6 voláš uvnitř funkce test() funkci test().

arr.push(test(obj.parid));

Co mi dál není jasný, že ve funkci test(id) máš v podmínce obj.catid, ale pak tu samou funkci voláš s jiným (?) klíčem objektu, test(obj.parid).

Prostě mi to bez toho pole není jasný.

Zpět do poradny Odpovědět na původní otázku Nahoru