У меня есть огромный (~ 20000 строк) файл .json, который был преобразован из файла .aml (разметка на основе XML). Я могу найти пару ключ: значение по ключу или значению, но я не могу найти, где она находится, например, «Документ [0]. Уровень [3] [2]. Sub [2]»
Цель состоит в том, чтобы преобразовать файл .json в другой, частично пригодный для JSON-LD, и мне нужно обобщить или переместить и объявить некоторые записи исходного .json.
Например, в следующем JSON:
myObj = {
"name": "John",
"age": 30,
"cars": {
"garage1": [{
"Car1": "Ford",
"Car2": "Seat"
}],
"garage2": [{
"car2": "BMW",
"car3": "Fiat"
}]
}
}
Я использую следующий код, чтобы найти пару:
function getKeys(obj, val) {
var objects = [];
for (var i in obj) {
if (!obj.hasOwnProperty(i)) continue;
if (typeof obj[i] == 'object') {
objects = objects.concat(getKeys(obj[i], val));
} else if (obj[i] == val) {
// objects.push(i);
objects.push(obj);
}
}
return objects;
}
И с
result = getKeys(myObj,'Ford');
Я получил:
[ { Car1: 'Ford', Car2: 'Seat' } ]
Проблема в том, что я не знаю, где это, а также не могу посмотреть, что находится во втором гараже, если он есть.
Я хотел бы также получить информацию о пути, например:
cars.garage1
С этой информацией я мог бы просмотреть более высокий уровень, например, автомобили.
В этом примере я мог бы просто сохранить путь во втором отношении «если». Но в моем большом файле мне также нужно будет удалить некоторые заметки о пути, если алгоритм зайдет слишком далеко, и мне нужно будет снова перейти на более высокий уровень, чтобы продолжить поиск. По крайней мере, это была моя идея.
Есть ли какая-либо команда или пакет для этого или мне нужно сохранить маршрут от поиска ключа?
Это мой первый пост, я также открыт для советов, как улучшить способ задавать вопросы здесь :)
Я отредактировал это, я ищу Путь



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы получить путь, пусть ваша рекурсивная функция возвращает массив и добавляет к нему ключ каждый раз, когда рекурсивный вызов успешен:
function getKeys(obj, val) {
if (obj === val) return []; // Found it!
if (Object(obj) !== obj) return; // A primitive value, but no match
for (const key in obj) {
if (!obj.hasOwnProperty(key)) continue;
const result = getKeys(obj[key], val);
if (result) return [key, ...result];
}
}
const myObj = {"name": "John","age": 30,"cars": { "garage1": [{ "Car1": "Ford", "Car2": "Seat" }], "garage2": [{ "car2": "BMW","car3": "Fiat"}] }};
console.info(getKeys(myObj, "Ford").join("/"));Вы можете собрать вложенные ключи и вернуть массив найденных путей.
function getPath(object, value) {
return Object
.keys(object)
.reduce((r, k) => {
var kk = Array.isArray(object) ? `[${k}]` : `${k}`;
if (object[k] === value) {
r.push(kk);
}
if (object[k] && typeof object[k] === 'object') {
r.push(...getPath(object[k], value).map(p => kk + (p[0] === '[' ? '' : '.') + p));
}
return r;
}, []);
}
var object = { name: "Ford", age: 30, cars: { garage1: [{ Car1: "Ford", Car2: "Seat" }], garage2: [{ car2: "BMW", car3: "Fiat" }] } };
console.info(getPath(object, 'Ford'));
Пожалуйста, добавьте желаемый результат. дорожка? ценность? конечный объект?