JSON — как получить «путь» к объекту

#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. Я думаю, он хочет обратного. Получить путь на основе значения.