Получить значение с помощью динамического и сложного ключа в JSON — JavaScript

#javascript #json

Вопрос:

Есть ли способ получить доступ к значению JSON с помощью составного строкового ключа ?

Позвольте мне объяснить, у меня есть следующий объект JSON :

 {
 "guy1":
 {
  "name":"Joe"
 }
}
 

Предположим, у нас есть массив guysArray , содержащий несколько объектов JSON, подобных приведенному выше, и строковую переменную

 let pathToName = "guy1.name"
 

Я заметил, что так поступить невозможно :

 guysArray[i].pathToName
 

Единственно правильный путь :

 guysArray[i].guy1.name

guysArray[i]["guy1"]["name"]
 

Как я мог бы сделать это программно, не записывая путь элемент за элементом ?

Обязан ли я создавать структуру цикла или для этого существует лучшая структура сохранения pathToName ?

Комментарии:

1. Проверьте Lodash.получите

2. Я не знал, что эта библиотека предоставляет эту функцию ! Это прекрасно, спасибо 🙂

Ответ №1:

попробуйте вот это :

 let yourData = `{
 "guy1":
 {
  "name":"Joe"
 }
}`

let stringToJson = JSON.parse(yourData)
let wantedValue = stringToJson['guy1'].name

console.log(wantedValue) 

Комментарии:

1. Ваш код stringToJson['guy1'].name похож на stringToJson['guy1']["name"] или stringToJson.guy1.name , и я этого не ищу.

2. Мне нужен способ сделать stringToJson["path"] или stringToJson.path получить непосредственно желаемое значение.

Ответ №2:

Как я мог бы сделать это программно, не записывая путь элемент за элементом ?

к сожалению, вы мало что можете сделать с помощью простых операторов и синтаксиса JavaScript, не добавляя что-то вроде пользовательской функции. Вы можете сделать

 > guysArray[i].guy1.name
"Joe"
 

но это не слишком поможет вам прямо сейчас, если вы хотите чего-то более общего.

Обязан ли я создавать структуру цикла или есть лучшая структура сохранения для имени пути?

Функция будет работать нормально, но вам может показаться интересной идея о том, что последовательность ключей в JSON может быть путем к значению.

В вашем случае имя находится в пути "guy1.name" , поэтому вы можете выполнить функцию, которая использует этот путь, разбивает его на "." части, а затем проходит по JSON, используя элементы пути в качестве ключей.

 > fromPath(guysArray[i], "guy1.name")
"Joe"
 

Эта идея описывается как JSONPath и должна быть выполнима для вас в качестве вашей собственной функции.

Комментарии:

1. Спасибо, это то, что я хотел знать 🙂

2. По сути, я искал способ быть более общим в своем подходе.