以递归方式循环遍历对象(树)有没有办法(在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])
}
}}我使用fooOP 的对象,这里是如何工作的
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
提交
取消
