0

I have multi level json data like

const data = {
    level11: "l11",
    level12: { level21: "l21", level22: { level31: "l31", level32: "l32" } },
    level13: [{ level131: "a" }, { level132: "b" }]
  };

I can easily get value by using property like data.level11 and the output is "l11" etc. but I have key name like "level11" or "level12.level22.level31" etc

for first level I can easily access value by using data["level11"] but n level value is not comming.

My solution is as following.

generateData = (data, key) => {
    if (!key.includes("."))
      return data[key];
    var p = key.split(".")[0];
    var ndata = data[p];
    if(!ndata) return;
    var newkey = key
      .split(".")
      .filter((o, i) => i !== 0)
      .join(".");
    return this.generateData(ndata, newkey);
  };

but it is not working on array values or object values

Is there any other way to get values by using key name.

export default function App() {
  const data = {
    level11: "l11",
    level12: { level21: "l21", level22: { level31: "l31", level32: "l32" } },
    level13: [{ level131: "a" }, { level132: "b" }]
  };
  generateData = (data, key) => {
    if (!key.includes("."))
      return data[key];
    var p = key.split(".")[0];
    var ndata = data[p];
    var newkey = key
      .split(".")
      .filter((o, i) => i !== 0)
      .join(".");
    return this.generateData(ndata, newkey);
  };
   
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <span>{this.generateData(data, "level12.level22.level31")}</span>
    </div>
  );
}
5
  • whats is your expected output for const data = { level11: "l11", level12: { level21: "l21", level22: { level31: "l31", level32: "l32" } }, level13: [{ level131: "a" }, { level132: "b" }] }; Commented Sep 6, 2022 at 11:19
  • It should be a stringfy json or string Commented Sep 6, 2022 at 11:22
  • can you paste the output expected response? Commented Sep 6, 2022 at 11:23
  • "level11" => "l11" "level12" => "{ level21: \"l21\", level22: { level31: \"l31\", level32: \"l32\" } }" "level12.level22.level31" => "l32" Commented Sep 6, 2022 at 11:25
  • 1
    @vicky Can you elaborate on this: but it is not working on array values or object values Commented Sep 6, 2022 at 11:39

1 Answer 1

1

You can use recursion for this kind of a problem.

Logic

  • Process Key: It will have 2 levels
    • Current Key
    • Rest of the path
  • Clean current key of any path specific special characters but not all. You can have key name like data-key
  • Loop over rest of the structure and get value

function processKey(key) {
  const k = key.match(/([^.\[\]])+/g)[0]
  const index = key.indexOf(k) + k.length  
  return [k, key.substr(index)]
}

function getValue(key, data) {
  const [k, rest] = processKey(key)
  if (!!rest) {
    return getValue(rest, data[k])
  }
  return JSON.stringify(data[k])
}

const data = {
  level11: "l11",
  level12: { level21: "l21", level22: { level31: "l31", level32: "l32" } },
  level13: [{ level131: "a" }, { level132: "b" }],
  level14: [[[{level132: 'bla'}]]]
};

console.log(getValue('level11', data))
console.log(getValue('level12', data))
console.log(getValue('level12.level22.level31', data))
console.log(getValue("level13[0].level131", data))
console.log(getValue("level14[0][0][0].level132", data))

Sign up to request clarification or add additional context in comments.

2 Comments

nice solution Rajesh but it is not working with the key name "level13[0].level131"
@vicky Nice problem. Took some time but was able to fix it. Please check the update and let me know if you have queries

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.