Ищем определенный ключ во всех вложениях объектов - PullRequest
0 голосов
/ 18 марта 2020

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

Существует набор данных:

let data = {
    'Test123': {
        'Another Test': {},
        'Test some more': {
            'Still testing?': {
                'Yeah...': {}
            },
            'Never ending story': {}
        }
    },
    'Leeeeeeeeeeeroy!' : {
        'Jenkins': {}
    }
};

И есть функция:

function findProperty (keyUnknown, dataPile) {
    let found;
    for (const [key, value] of Object.entries(dataPile)) {
        if (keyUnknown === key) {
            found = value;
            break;
        } else {
            found = findProperty(keyUnknown, value);
        }
    }
    return found;
}
let questionsToRender = findProperty(key, data);

При заданном ключе для поиска «Проверить еще», функция возвращает неопределенное значение, может кто-нибудь взглянуть на это? Я застрял на нем уже довольно много.

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Вам просто нужно также проверить, является ли found неопределенным или нет в другом состоянии.

let data = {"Test123":{"Another Test":{},"Test some more":{"Still testing?":{"Yeah...":{}},"Never ending story":{}}},"Leeeeeeeeeeeroy!":{"Jenkins":{}}}

function findProperty(keyUnknown, dataPile) {
  let found;
  for (const [key, value] of Object.entries(dataPile)) {
    if (keyUnknown === key) {
      found = value;
      break;
    } else if (!found) {
      found = findProperty(keyUnknown, value);
    }
  }
  return found;
}

let questionsToRender = findProperty('Test some more', data);
console.log(questionsToRender)
0 голосов
/ 18 марта 2020

Помимо пропущенного чека, вы можете выбрать более компактный подход и вернуться на ранний срок, если найдете.

function find(key, object) {
    var value;
    if (!object || typeof object !== 'object') return;
    if (key in object) return object[key];
    Object.values(object).some(v => value = find(key, v));
    return value;
}

let data = { Test123: { 'Another Test': {}, 'Test some more': { 'Still testing?': { 'Yeah...': {} }, 'Never ending story': {} } }, 'Leeeeeeeeeeeroy!' : { Jenkins: {} } };

console.log(find('Still testing?', data));
...