javascript - Procházet více polí, kombinovat je do jednoho pole a zachovat indexy v rámci podpole
Trochu dlouhý název, ale zkusím vysvětlit, co chci udělat. V podstatě mám několik polí, která chci sloučit do jednoho pole. Problém je v tom, že potřebuji projít položky v podpolích a přidávat je po jednom a zachovat pořadí. Konečným cílem je, že chci data znovu zobrazit stránkovaně. Níže mám jednoduchý příklad, který použiji k tomu, abych vysvětlil, co myslím. Nejde o abecední řazení, tj. h by nemělo být před i v dolním příkladu.
Takže v mém příkladu vím, že chci 3 stránky výsledků. První stránka by měla mít 4 položky, druhá stránka 4 položky a třetí pouze 1 položku.
Mohu provést konečné stránkování sám, protože na konci budu mít pole všech vnitřních položek "mix", ale nemohu přijít na to, jak projít svá pole a přidat je tak, jak potřebuji.
Mám proměnnou stránky přede mnou, ale nejsem si jistý, jak strukturovat smyčku. Myslím, že v podstatě potřebuji projít každý podpole a odstraňovat první položku pomocí pop(), pak projít další podpole, odstraňovat první položku a tak dále. Ale někde musím zkontrolovat, kolik položek zůstává v každém podpoli.
Například pokud bych měl pouze pole "one", teoreticky bych měl 2 stránky, první obsahující a,c,e,i a druhou pouze k, tato je očividně dost jednoduchá, protože jen kontroluji délku jediného pole.
Ale pokud bych přidal další pole "třetí" [1,2,3,4,5], pak bych očekával, že výsledné pole bude ['a','b',1,'c','d',2...atd.]; Každé z těchto polí by teoreticky mohlo mít různou délku, takže bych samozřejmě přeskočil prázdnou hodnotu.
var one = ['a','c','e','i','k'];
var two = ['b','d','f','h'];
var all = [one,two];
var pagecount = 3;
var mix = [];
for(var i = 0; i< all.length; i++){
var area = all[i];
}
// End result should be mix = ['a','b','c','d','e','f','i','h','k'];
Snažil jsem se to formulovat co nejlépe, jak umím, ale mám potíže přijít na to, jak to sám vysvětlit! Bohužel v reálném světě nemám žádnou kontrolu nad daty/velikostí datových polí.
Pokud máte nějaké otázky nebo pokud něčemu nerozumíte, prosím, zanechte komentář.
Odpověď č. 1
Následující by mělo fungovat:
for (var i = 0; all.length !== 0; i++) {
var j = 0;
while (j < all.length) {
if (i >= all[j].length) {
all.splice(j, 1);
} else {
mix.push(all[j][i]);
j += 1;
}
}
}
Při každé iteraci vnější smyčky zvýšíme i o jedna, toto bude index v každém poli, ze kterého budeme vybírat položku. Pro vnitřní smyčku provedeme jednu z následujících možností:
- Pokud je index
iza maximálním indexem poleall[j], dokončili jsme práci s tímto polem, takže je odstraněno pomocíall.splice(j, 1). Nepokračujeme sj, protožeall[j]bude odkazovat na další pole poté, co byl předchozí prvek na tomto místě odstraněn. - Jinak přidáme položku
all[j][i]domixa zvýšímejo jedna, abychom se při další iteraci přesunuli k dalšímu poli.
Vnější smyčka se nezastaví, dokud v all nezůstávají žádná pole, což nastane, když i překročí délku nejdelšího pole.
Například se třemi poli, každé o jiné délce:
var one = [1, 2, 3, 4];
var two = ['a', 'b'];
var three = ['U', 'V', 'W', 'X', 'Y', 'Z'];
var all = [one, two, three];
var mix = [];
// after running the above loop mix will have the following contents:
// [1, "a", "U", 2, "b", "V", 3, "W", 4, "X", "Y", "Z"]
Odpověď č. 2
Procházejte vnitřní index ve vnějším cyklu a pole ve vnitřním cyklu:
for (var i = 0, cont = true; cont; i++) {
cont = false;
for (j = 0; j < all.length; j++) {
if (i < all[j].length) {
mix.push(all[j][i]);
cont = true;
}
}
}
