#javascript #json #typescript
#javascript #json #typescript
Вопрос:
В моем проекте React у меня есть вложенный JSON, и я хочу получить ключ к объекту в виде строки:
Предполагая, что у меня есть JSON из
{
"section_1": {
"sub_1": {
"object_1": {
"property_1": {},
"property_2": {}
}
}
}
Я хочу импортировать этот JSON в виде модуля и использовать приятное автозаполнение для выбора ключей, но если я передам
section_1.sub_1.object_1
Я хочу иметь "section_1.sub_1.object_1"
в качестве выходных данных.
Использование Object.keys()
не является ответом, потому что Object.keys(section_1.sub_1.object_1)
даст мне ["property_1","property_2"]
Пример:
import paths from './paths.json'
...
<MyComponent data-path={jsonObjectNameFunction(section_1.sub_1.object_1)} />
...
Я хочу data-path="section_1.sub_1.object_1"
Комментарии:
1. Я не понимаю, что вы пытаетесь сделать. Не могли бы вы, пожалуйста, предоставить конкретный пример, шаг за шагом? Где вы хотите, чтобы отображалось автозаполнение? Откуда выводится эта строка?
2. @Hawk Пожалуйста, смотрите мои обновления
Ответ №1:
Вам нужно будет передать не только section_1.sub_1.object_1
, но и объект для поиска внутри (назовем его obj
), вот так;
const obj = /*the import resulting in:*/{
"section_1": {
"sub_1": {
"object_1": {
"property_1": {},
"property_2": {}
}
}
};
someFunction(obj, obj.section_1.sub_1.object_1);
Чтобы реализовать someFunction
, мы должны найти пары имя / значение на каждом уровне, которые ведут к go obj
, что-то вроде этого:
function someFunction(container, target, path = "") {
for (const [key, value] of Object.entries(container)) {
const possiblePath = path ? path "." key : key;
if (value === target) {
return possiblePath;
}
if (value amp;amp; typeof value === "object") {
const found = someFunction(value, target, possiblePath);
if (found) {
return found;
}
}
}
return null;
}
Живой пример:
"use strict";
const obj = /*the import resulting in:*/{
"section_1": {
"sub_1": {
"object_1": {
"property_1": {},
"property_2": {}
}
}
}
};
console.log(someFunction(obj, obj.section_1.sub_1.object_1));
function someFunction(container, target, path = "") {
for (const [key, value] of Object.entries(container)) {
const possiblePath = path ? path "." key : key;
if (value === target) {
return possiblePath;
}
if (value amp;amp; typeof value === "object") {
const found = someFunction(value, target, possiblePath);
if (found) {
return found;
}
}
}
return null;
}
Ответ №2:
Я понимаю, что вы хотите получить значение из базы объектов по пути.
Вы можете использовать Lodash, получая значение по пути
Комментарии:
1. Я думаю, он хочет обратного. Получить путь на основе значения.