Dynamischer JSON Pfad?


27.04.2022, 22:00

Es geht leider nicht ohne Iteration / Rekursion. Hier dennoch eine relativ angenehme und vor allem kurze Lösung des Problems:

function resolve(path, obj) {
    return path.split('.').reduce((prev, curr) =>  {
        return prev ? prev[curr] : null
    }, obj || self)
}

const obj = {
  test: {
    test2: {
      test3: {
        test4: "hallo"
      }
    }
  }
}

const path = "test.test2.test3.test4";
console.log(resolve(path, obj)); // hallo

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

a) Mit eval:

const path = "test.test2.test3.test4";
console.log(eval("obj." + path));

b) Mit einer Helferfunktion:

function getJsonValueByPath(jsonObject, path) {
  const keys = path.split(".");
  let value = jsonObject;

  for (const key of keys) {
    value = value[key];
  }

  return value;
}

const path = "test.test2.test3.test4";
console.log(getJsonValueByPath(obj, path));

https://jsfiddle.net/6w92gpmL/

allerdings musst du strings erstmal in ein JSON objekt wandeln . oder verarbeiten. oder steht in deiner textdatei wirklich let obj= .....

ausserdem solltest du ein wohlgeformtest JSON objekt haben

https://jsfiddle.net/6w92gpmL/3/

const teste = '{"test":{"test2":{"test3":{"test4": "hallo"}}}}';
const obj = JSON.parse(teste);
console.log(obj.test.test2.test3.test4)

output : 
"hallo"
einzeIgaenger 
Fragesteller
 27.04.2022, 21:11

^^ So meinte ich das nicht.
Ich will ja nicht händisch test.test2.test3.test4 eingeben müssen. sei es manuell oder durch eine loop. ich will das objekt direkt mit dem string aus der text datei füttern.

0
TechPech1984  27.04.2022, 21:37
@einzeIgaenger

hääääää

ok, ich glaub du hast irgendwie programmieren nicht verstanden .

dann lese doch nur den text aus den du brauchst .

regex : /test4:"(.*)"/

oder

regex : /"(.*)")/

zum thema programmieren , wenn du eine datenstruktur hast dann musst du natürlich auch die datenstruktur nutzen . nix weiss, das du da irgendwo ein string hast oder so . sorry das ich das so sagen muss , aber du musst schon beim programmieren und nicht beim träumen bleiben . fürs träumen gibts menschen , für alles andere halt programmieren und daten . leider sagst du auch nichts zu deiner aufgabe , deswegen gehe ich mal nicht weiter in meinen lösungen , weil dann bestimmt wieder so ein unlogisches genörgel kommt . mimimi "aber die daten kenn ich doch gar nicht ". ja dann iterier halt bis du irgendwo ein string findest, fals es der einzige ist .

p.s. dein JSON format stimmt aber eh nicht .

0
einzeIgaenger 
Fragesteller
 27.04.2022, 21:49
@TechPech1984
 deswegen gehe ich mal nicht weiter in meinen lösungen 

ist glaub ich besser so. du hast das problem leider nicht begriffen und verschwendest nur deine & meine zeit.

0
einzeIgaenger 
Fragesteller
 27.04.2022, 21:57
@TechPech1984

Hier, hab die Lösung selbst erarbeitet, kannst du bestimmt auch noch was lernen xD:

function resolve(path, obj) {
    return path.split('.').reduce(function(prev, curr) {
        return prev ? prev[curr] : null
    }, obj || self)
}

const obj = {
  test: {
    test2: {
      test3: {
        test4: "hallo"
      }
    }
  }
}


const path = "test.test2.test3.test4";


console.log(resolve(path, obj)) // hallo
0