以递归方式循环遍历对象(树)有没有办法(在jQuery或JavaScript中)循环遍历每个对象,它的子孙和孙子等等?如果是这样......我还可以读他们的名字吗?例:foo :{
bar:'',
child:{
grand:{
greatgrand: {
//and so on
}
}
}}所以循环应该做这样的事情......loop start if(nameof == 'child'){
//do something
}
if(nameof == 'bar'){
//do something
}
if(nameof =='grand'){
//do something
}loop end
3 回答
慕码人2483693
TA贡献1860条经验 获得超9个赞
你正在寻找for...in
循环:
for (var key in foo){ if (key == "child") // do something...}
请注意,for...in
循环将遍历任何可枚举属性,包括添加到对象原型的属性。要避免对这些属性执行操作,可以使用该hasOwnProperty
方法检查属性是否仅属于该对象:
for (var key in foo){ if (!foo.hasOwnProperty(key)) continue; // skip this property if (key == "child") // do something...}
递归执行循环可以像编写递归函数一样简单:
// This function handles arrays and objectsfunction eachRecursive(obj){ for (var k in obj) { if (typeof obj[k] == "object" && obj[k] !== null) eachRecursive(obj[k]); else // do something... }}
慕桂英546537
TA贡献1848条经验 获得超10个赞
如果要返回关系树,可以递归使用Object.keys。
function paths(item) { function iter(r, p) { var keys = Object.keys(r); if (keys.length) { return keys.forEach(x => iter(r[x], p.concat(x))); } result.push([p]) } var result = []; iter(item, []); return result;}var data = { foo: { bar: '', child: { grand: { greatgrand: {} } } }}console.log(paths(data));
慕村225694
TA贡献1880条经验 获得超4个赞
您可以使用内置的解析函数来创建递归函数。
function parseObjectProperties (obj, parse) { for (var k in obj) { if (typeof obj[k] === 'object' && obj[k] !== null) { parseObjectProperties(obj[k], parse) } else if (obj.hasOwnProperty(k)) { parse(obj[k]) } }}
我使用foo
OP 的对象,这里是如何工作的
var foo = { bar:'a', child:{ b: 'b', grand:{ greatgrand: { c:'c' } } }}// use this recursive function with a parse funcitonfunction parseObjectProperties (obj, parse) { for (var k in obj) { if (typeof obj[k] === 'object' && obj[k] !== null) { parseObjectProperties(obj[k], parse) } else if (obj.hasOwnProperty(k)) { parse(obj[k]) } }}//***// then apply to the property the task you want, in this case just consoleparseObjectProperties(foo, function(prop) { console.log(prop)})
添加回答
举报
0/150
提交
取消