Vyhledávání na webu

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 i za maximálním indexem pole all[j], dokončili jsme práci s tímto polem, takže je odstraněno pomocí all.splice(j, 1). Nepokračujeme s j, protože all[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] do mix a zvýšíme j o 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;
    }
  }
}