Kav*_*gel 13 javascript recursion object
我正在研究一个具有可变深度的权限系统; 根据页面的复杂程度,可能会有更多或更少的级别.我搜索了StackOverflow,发现之前是否有人问过,找不到它.
如果我有这个对象:
{foo:{bar:{baz : 'baa'}}}
Run Code Online (Sandbox Code Playgroud)
我需要它返回3,它有3个级别.
有了这个对象:
{abc: 'xyz'}
Run Code Online (Sandbox Code Playgroud)
它必须是1.
这是我到目前为止:
utils.depthOf = function(object, level){
// Returns an int of the deepest level of an object
level = level || 1;
var key;
for(key in object){
if (!object.hasOwnProperty(key)) continue;
if(typeof object[key] == 'object'){
level++;
level = utils.depthOf(object[key], level);
}
}
return level;
}
Run Code Online (Sandbox Code Playgroud)
问题是它也算姐妹元素.它实际上没有得到深度,它正在计算一个对象的所有成员.
Kav*_*gel 25
嗯,在这里你去哥们,一个完全符合你需要的功能!
utils.depthOf = function(object) {
var level = 1;
var key;
for(key in object) {
if (!object.hasOwnProperty(key)) continue;
if(typeof object[key] == 'object'){
var depth = utils.depthOf(object[key]) + 1;
level = Math.max(depth, level);
}
}
return level;
}
Run Code Online (Sandbox Code Playgroud)
比我们想象的容易得多.问题是它是如何递增的,它不应该是递归地添加,而是获得最底层并添加一个,然后选择两个兄弟之间的最大值.
这个老问题最近又复活了,我没有看到任何像这个这样简单的答案(公平地说,这使用了编写问题时不可用的技术):
const objectDepth = (o) =>
Object (o) === o ? 1 + Math .max (-1, ... Object .values(o) .map (objectDepth)) : 0
console .log (objectDepth ({foo: {bar: {baz: 'baa'}}}))
console .log (objectDepth ({abc: 'xyz'}))Run Code Online (Sandbox Code Playgroud)
就像这里的大多数答案一样,当输入对象是循环时,这将会失败。解决这一限制的答案需要更加复杂。
| 归档时间: |
|
| 查看次数: |
15918 次 |
| 最近记录: |