在所有对象嵌套中寻找特定键

时间:2020-03-18 08:52:57

标签: javascript loops self-reference

我正在尝试构建一个函数,该函数将在对象的所有嵌套中查找给定的属性键,然后返回给定,找到的键的值。

有数据集:

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

给出找到“ Test more more”的键,函数返回未定义的值,有人可以看看吗?我已经坚持了很多次。

2 个答案:

答案 0 :(得分:1)

您只需要检查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)

答案 1 :(得分:0)

除了缺少支票,您还可以采用更紧凑的方法,并在找到后尽早返回。

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