Как получить ключи (путь к) самого глубокого вложенного объекта в вложенном объекте javascript - PullRequest
1 голос
/ 27 марта 2019

У меня есть вложенный объект javascript, подобный этому:

{
    "apple": {
        "orange": {
            "chilli": {},
            "pineapple": {
                "mango": {}
            }
        },
        "carrot": {
            "cabbage": {},
            "onion": {}
        }
    }
}

Я хочу получить путь (ключи) самого глубокого вложенного объекта.что-то вроде apple.orange.pineapple.mango

любая помощь ценится:)

Ответы [ 2 ]

3 голосов
/ 27 марта 2019

var object = {
    "apple": {
        "orange": {
            "chilli": {},
            "pineapple": {
                "mango": {}
            }
        },
        "carrot": {
            "cabbage": {
                "cherries":{}
            },
            "onion": {}
        }
    }
}
var maxLevel = 0;
var maxPaths = [];
function findDeepest(obj, level, path) {
  var keys = Object.keys(obj) // get keys
  for(var i=0; i< keys.length; i++) {
    var newPath = level !== 0 ? path + "." + keys[i] : keys[i] // construct path string
    // Recursively call 
    findDeepest(obj[keys[i]], level + 1, newPath )
  }
  if (level > maxLevel) { // There is a deeper key
     maxLevel = level
     maxPaths = [path] // create a fresh list
  } else if (level === maxLevel) {
    maxPaths.push(path) // add key to the list, as it has the same depth
  }

}
findDeepest(object, 0, "")
console.log(maxLevel)
console.log(maxPaths)

Вышеприведенная функция рекурсивно обходит весь объект и производит сравнение на основе глубины.Если глубина больше, чем какой-либо ключ, встреченный ранее (я проверил это с помощью глобальных переменных, что не является хорошей практикой), он обновляет глубину и путь.Если есть другой ключ с таким же значением maxDepth, он также добавляется в список maxPaths.После завершения рекурсии ваши переменные maxLevel и maxPaths дают вам самый глубокий ключ с его путем и уровнем.

1 голос
/ 27 марта 2019

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

Это работает для нескольких путей одинаковой длины.

function getDeepest(object) {
    return object && typeof object === 'object'
        ? Object.entries(object).reduce((r, [k, o]) => {
            var temp = getDeepest(o).reduce((r, a, i) => {
                    if (!i || r[0].length < a.length) return [a];
                    if (r[0].length === a.length) r.push(a);
                    return r;
                }, []);

            return temp.length
                ? [...r, ...temp.map(t => [k].concat(t))]
                : [...r, [k]];
        }, [])
        : [];
}

var object = { apple: { orange: { chilli: {}, pineapple: { mango: {} } }, carrot: { cabbage: {}, onion: {} } } };

console.log(getDeepest(object).map(a => a.join('.')));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...