如何获取javascript嵌套对象中最深嵌套对象的键(路径)

问题描述 投票:1回答:2

我有一个嵌套的javascript对象,如下所示:

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

我想获得最深嵌套对象的路径(键)。有点像apple.orange.pineapple.mango

任何帮助表示赞赏:)

javascript javascript-objects
2个回答
1
投票

您可以返回具有最长路径的数组数组。

这适用于具有相同长度的多个路径。

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

3
投票

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列表中。递归结束后,你的maxLevelmaxPaths变量会为你提供最深的密钥及其路径和级别。

© www.soinside.com 2019 - 2024. All rights reserved.