Zugriff auf Objekt

stewue

Grünschnabel
Hallo zusammen

ich suche verzweifelt nach einer Lösung für folgendes Problem:

ich brauche eine Funktion, welche "dynamisch" auf ein Objekte zugreifen kann.

Objekt:
PHP:
var obj = {
'a' : 'b',
'c' : {'d' : 'e', 'f' : {'g' : 'h'}}
}

Diese Zugriffe brauche ich:
PHP:
1. obj[a]
2. obj[ c][d]
3. obj[ c][f][g]
...

Wie mache ich das am Besten in JS?

Lg stewue
 
ich kann nicht einfach zu darauf zugreifen... Es muss eine Funktion sein, welcher beliebig viele Parameter mitgegeben werden können

PHP:
functio aufruf(par1, par2, par3, par4, par5, ....)
{
return obj[par1][par2][par3][par4][par5][...];
}
 
Javascript:
function foo(obj) {
    for(var i = 1; obj && i < arguments.length; i++) {
        obj = obj[arguments[i]];
    }
  
    return obj;
}

var x = foo({'a' : 'b', 'c' : {'d' : 'e', 'f' : {'g' : 'h'}}}, 'c', 'f');
             
console.log(x);
 
danke für deine Antwort.

Dann hab ich noch eine zweie Frage:
Wenn ich wieder das Objekt von oben habe und folgendes machen möchte (wieder "dynamisch"):

Code:
var obj = {'a' : 'b', 'c' : {'d' : 'e', 'f' : {'g' : 'h'}}};

obj['a'] = 'x';
obj['c']['d'] = 'y';
obj['c']['f']['g'] = 'z';

Funktioniert dies auch so ähnlich wie oben?
 
Meine Idee war in etwa so:
Code:
function foo(obj) {
        for(var i = 1; obj && i < arguments.length-1; i++) {
            obj = obj[arguments[i]];
        }
        obj = arguments[arguments.length-1];
        return obj;
    }

    var x = foo({'a' : 'b', 'c' : {'d' : 'e', 'f' : {'g' : 'h'}}}, 'c', 'f', {'g' : 'aendern'});

    console.log(x);
aber Problem ist dann, dass ja nicht das ganze Objekt zurückgegeben wird
 
Fast richtig. Du musst nur die Schleife einen Schritt früher abbrechen. Und ich würde das neue Element als zweiten Parameter übergeben, es ist so üblich dass dynamische Argumente am Schluss stehen.

Fehlerabfangen habe ich weggelassen (prüfen ob die Route durch das Objekt überhaupt existiert)

Javascript:
function setFoo(obj, val) {
    var args = arguments;
    var len = args.length;
    var i;
  
    for(i = 2; i < len - 1; i++) {
        obj = obj[args[i]];
    }
  
    obj[args[i]] = val;
}
 
var obj = {'a' : 'b', 'c' : {'d' : 'e', 'f' : {'g' : 'h'}}};

setFoo(obj, {'n': {'e': 'u'}}, 'c', 'd');
             
console.log(JSON.stringify(obj));
 

Neue Beiträge

Zurück