慕妹3146593
2019-08-08 16:29:48
以遞歸方式循環(huán)遍歷對(duì)象(樹(shù))有沒(méi)有辦法(在jQuery或JavaScript中)循環(huán)遍歷每個(gè)對(duì)象,它的子孫和孫子等等?如果是這樣......我還可以讀他們的名字嗎?例:foo :{
bar:'',
child:{
grand:{
greatgrand: {
//and so on
}
}
}}所以循環(huán)應(yīng)該做這樣的事情......loop start if(nameof == 'child'){
//do something
}
if(nameof == 'bar'){
//do something
}
if(nameof =='grand'){
//do something
}loop end
3 回答

慕碼人2483693
TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊
你正在尋找for...in
循環(huán):
for (var key in foo){ if (key == "child") // do something...}
請(qǐng)注意,for...in
循環(huán)將遍歷任何可枚舉屬性,包括添加到對(duì)象原型的屬性。要避免對(duì)這些屬性執(zhí)行操作,可以使用該hasOwnProperty
方法檢查屬性是否僅屬于該對(duì)象:
for (var key in foo){ if (!foo.hasOwnProperty(key)) continue; // skip this property if (key == "child") // do something...}
遞歸執(zhí)行循環(huán)可以像編寫遞歸函數(shù)一樣簡(jiǎn)單:
// 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貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果要返回關(guān)系樹(shù),可以遞歸使用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貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以使用內(nèi)置的解析函數(shù)來(lái)創(chuàng)建遞歸函數(shù)。
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 的對(duì)象,這里是如何工作的
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)})
添加回答
舉報(bào)
0/150
提交
取消