ugrás a tartalomhoz

Dinamikus többdimenziós tömb értékadása jQuery-ben

Totti 1986 · 2016. Már. 2. (Sze), 22.30
Sziasztok!

Valószínűleg elméleti hiányosságaim vannak a következő probléma megoldásához, ezért kérném a segítségeteket.

Vannak weboldalon belüli kliens oldali folyamatok, amik többféle, különböző mélységű tömböknek adnak értéket, aszerint, hogy milyen folyamat futott le.
Csakhogy ezek között a tömbök között vannak kétdimenziósak, de vannak ötdimenziósak is. A különböző mélységű indexek majdhogynem véletlenszerűek, nem tudom őket előre deklarálni.

PHP-ban pl. megtudom azt csinálni, hogy:

$arr['xyz'][$a][$b][$c][$d] = 'x';
ahol $a, $b, $c, $d aktuális értékeket vesznek fel.
De ugyanezt már nem tudom megadni javascriptben vagy jquery-ben, még globális változóval se:

$.glob['xyz'][a][b][c][d] = 'x';
Ugyanis, ha a fenti tömb elemének szeretnék értéket adni, undefined-ot kapok.
Ha:

$.glob['xyz'] = [];
$.glob['xyz'][a] = [];
formában deklarálom is, a következő mélység akkor is undefined lesz.

A kérdésem az lenne, hogyan tudnék egy olyan, akár rekurzív függvényt írni, amit ha meghívok, tetszőleges mélységig levizsgálja a tömböt, és ha az adott mélységig nem tömb, deklarálja, és lejjebb megy még egy mélységet.

Pl.:

var arrName= 'xyz';
var levels = [3,12,0,1];
var value = 'x';

addValue(arrName, levels, value);

function addValue(arrName, levels){
//...
}
A fenti függvénnyel a $.glob['xyz'] nevű tömb $.glob['xyz'][3][12][0][1] elemének tudnék 'x' értéket adni úgy, hogy ha egy mélység nincs deklarálva, akkor akár rekurzívan deklarálja a függvény, és megadja neki az 'x' értéket.

Köszi előre is!
 
1

arguments

Hidvégi Gábor · 2016. Már. 2. (Sze), 23.55
Ha a következő sort még nézegeted kicsit, rájössz, hogy milyen egyszerű a megoldás:

$arr['xyz'][$a][$b][$c][$d] = 'x';
5

Én mondjuk nem értem, hogy

Joó Ádám · 2016. Már. 3. (Cs), 02.25
Én mondjuk nem értem, hogy mire gondolsz.
8

Pedig leírtam a teljes

Hidvégi Gábor · 2016. Már. 3. (Cs), 10.25
Pedig leírtam a teljes megoldást. Paraméterek

function ertekadas(arr, 'xyz', a, b, c, d, 'x') {
  (...)
}
9

Láthatóan nem erre a részére

Joó Ádám · 2016. Már. 3. (Cs), 16.02
Láthatóan nem erre a részére vonatkozott a kérdés.
2

Ilyen formában nem is kapsz

Mistic97 · 2016. Már. 3. (Cs), 00.37
Ilyen formában nem is kapsz mást, csak egy jó nagy hibaüzenetet.

JavaScriptben nincsenek kulcsos tömbök, a többdimenziós tömb létrehozása ily módon (is) történik:

var array = [
		new Array('Hello', 'World'),
		new Array('Lorem', 'ipsum')
	];
	console.log(array[0][1]); // World
4

JavaScriptben nincsenek

Joó Ádám · 2016. Már. 3. (Cs), 02.22
JavaScriptben nincsenek kulcsos tömbök
Mit értesz kulcsos tömb alatt?
3

A függvényednek végig kell

Joó Ádám · 2016. Már. 3. (Cs), 02.21
A függvényednek végig kell iterálnia az indexeken az utolsót kivéve, és minden lépésben
  1. megvizsgálnia az aktuális tömbön az adott indexet,
  2. ha kell, létrehozni az indexen egy tömböt,
  3. beállítani az indexen található tömböt aktuálisként,
végül az aktuális tömbön az utolsó indexen beállítani az értéket.

Hol akadsz el?
6

paraméter

Totti 1986 · 2016. Már. 3. (Cs), 08.24
Ott akadok el, hogy hogy megyek le pl. 3 mélységig? A tömb indexei pl.

$.glob['xyz'][0][1][5]
A 0,1,5, sőt az is, hogy ez egy 3 dimenziós tömb, mind paraméter.

A fgv. ami végigmegy az általad leirt 3 ponton, paraméteresen hogy megy le 3 szintet?
És ha a következő meghívás egy 6 dimenziós tömböt írna, akkor hogy megyek le paraméteresen 6 mélységig?
7

for ciklussal vagy

Hidvégi Gábor · 2016. Már. 3. (Cs), 10.22
for ciklussal vagy iterációval. Egyébként ezt a feladatot PHP-ban is ugyanúgy kell megoldani, mint javascriptben.
10

Ahogy Gábor írja, annyiszor

Joó Ádám · 2016. Már. 3. (Cs), 16.04
Ahogy Gábor írja, annyiszor ismétli ciklusban a három lépést a függvény, ahány eleme van az indexeket tartalmazó tömbnek, így tetszőleges mélységig működik.
11

példa

Totti 1986 · 2016. Már. 3. (Cs), 17.30
Akkor leírok egy példafüggvényt, aztán kiderül, jól értem-e.

var arrName= 'xyz';  
var levels = [3,12,0,1];  
var value = 'x';  
  
arrValue(arrName, levels, value, actLevel); 
 
function arrValue(arrName, levels, value, actLevel){

	if(actLevel == 'undefined') {
		actLevel = 0;
	}

	if(!$.isArray($.glob[arrName][levels[actLevel]])) {
		$.glob[arrName][levels[actLevel]] = [];
	}
	$.glob[arrName][levels[actLevel]][levels[actLevel+1]] = value;
}
Ez a függvény egy adott szintet dolgoz fel.
De hogy megyek lejjebb?
Úgy hogy ugyanez a formula, vagy egy ehhez hasonló végig tudjon menni az összes levels tömbben megadott mélységű indexen.
Mert ugye nekem a
$.glob['xyz'][3][12][0][1]
indexű elemnek kell 'x' értéket adnom.
12

Ez talán segít. Úgy nézem

smokey · 2016. Már. 3. (Cs), 22.47
Ez talán segít. Úgy nézem működik, meg minden, viszont nem a szép és gyorsan működő megoldás. Lévén, hogy tömbről van szó referenciákkal sem nagyon lehet dolgozni, szóval ezt tudtam kihozni a dologból. A set() függvény feltétele, hogy létezzen az az állapot, amire hivatkozol. Ha ciklusidőben létre is akarod hozni a tömböket, akkor kicsit meg kell pimpelni a ciklus magját...


var glob = {
'xyz':
	[[],[],[],[
  	[],[],[],[],[],[],[],[],[],[],[],[],[
    	[
      	[], []
      ]
    ]
  ]]
};
var set = function(){
    var arrayName = arguments[0];
    var generatedArrayRef = "glob['" + arrayName + "']"
    for (var i = 1; i < arguments.length - 1; i++) {
        var currentIndex = arguments[i];
				generatedArrayRef += "[" + currentIndex + "]"; 
		}
    var value = arguments[arguments.length - 1];
    var command = generatedArrayRef + " = value";
    eval(command);
};

set('xyz', 3, 12, 0, 1, 'x');
console.log(glob['xyz'][3][12][0][1]);

13

Talán

Totti 1986 · 2016. Már. 4. (P), 12.37
Talán segítene, ha ehhez nem kéne külön deklarálnom az adott mélységet, tehát ezt:

var glob = {  
'xyz':  
    [[],[],[],[  
    [],[],[],[],[],[],[],[],[],[],[],[],[  
        [  
        [], []  
      ]  
    ]  
  ]]  
};  
automatikusan kellene végrehajtania.
14

Parancsolj :).Nem

smokey · 2016. Már. 4. (P), 13.06
Parancsolj :).

Nem teszteltem rongyosra, de a példád alapján működik:


var glob = {};
var set = function(){
    var arrayName = arguments[0];
    if (typeof(glob[arrayName]) === 'undefined') {
   	    glob[arrayName] = [];
    }
    
    var generatedArrayRef = "glob['" + arrayName + "']"
    for (var i = 1; i < arguments.length - 1; i++) {
        var currentIndex = arguments[i];
        var generatedArrayRefTemp = generatedArrayRef;
        var defined;
				generatedArrayRef += "[" + currentIndex + "]";
        var validationCommand = "defined = typeof(" + generatedArrayRef + ") !== 'undefined'";
        eval(validationCommand);
        if (!defined) {
            var validityCommand = generatedArrayRef + " = []";
            eval(validityCommand);
        }
		}
    var value = arguments[arguments.length - 1];
    var command = generatedArrayRef + " = value";
    eval(command);
};

set('xyz', 3, 12, 0, 1, 'x');
console.log(glob['xyz'][3][12][0][1]);

Update: A megadott index alatt a tömbök létrejönnek, viszont az első szinten a 0, 1, 2 indexen a tömb elemek undefined értéket kapnak. Ha fut az alkalmazás, és közben a set() segítségével kap értéket a tömb a nem definiált indexeken, akkor az elvileg működni fog.

pl.:


set('xyz', 3, 12, 0, 1, 'x');
set('xyz', 0, 'a');
set('xyz', 1, 'b');
set('xyz', 2, 'c');

15

Működik? Tudok segíteni

smokey · 2016. Már. 7. (H), 20.12
Működik? Tudok segíteni esetleg még?
16

Bocsánat, nem tudtam azóta

Totti 1986 · 2016. Ápr. 21. (Cs), 10.59
Bocsánat, nem tudtam azóta kipróbálni, mert behalt a gépem.