Как получить путь к паре ключ JSON: значение

У меня есть огромный (~ 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

С этой информацией я мог бы просмотреть более высокий уровень, например, автомобили.

В этом примере я мог бы просто сохранить путь во втором отношении «если». Но в моем большом файле мне также нужно будет удалить некоторые заметки о пути, если алгоритм зайдет слишком далеко, и мне нужно будет снова перейти на более высокий уровень, чтобы продолжить поиск. По крайней мере, это была моя идея.

Есть ли какая-либо команда или пакет для этого или мне нужно сохранить маршрут от поиска ключа?

Это мой первый пост, я также открыт для советов, как улучшить способ задавать вопросы здесь :)

Пожалуйста, добавьте желаемый результат. дорожка? ценность? конечный объект?

Nina Scholz 28.01.2019 13:22

Я отредактировал это, я ищу Путь

Aschenauer 28.01.2019 13:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
675
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы получить путь, пусть ваша рекурсивная функция возвращает массив и добавляет к нему ключ каждый раз, когда рекурсивный вызов успешен:

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'));

Другие вопросы по теме