有没有办法(在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
答案 0 :(得分:82)
您正在寻找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 objects
function eachRecursive(obj)
{
for (var k in obj)
{
if (typeof obj[k] == "object" && obj[k] !== null)
eachRecursive(obj[k]);
else
// do something...
}
}
答案 1 :(得分:2)
如果要返回关系树,可以递归使用Object.keys。
$scriptver = "12.0"
答案 2 :(得分:1)
考虑学习object-scan。将头包裹起来后,它对数据处理非常强大。
一件很棒的事情是,这些物品以“删除安全”的顺序遍历。因此,如果删除一个,它不会弄乱循环。您还可以访问许多其他属性,例如父母等。
const objectScan = require('object-scan');
const obj = {
foo: {
bar: '',
child: {
grand: {
greatgrand: {
// and so on
}
}
}
}
};
objectScan(['**'], {
filterFn: ({ property }) => {
console.log(property);
}
})(obj);
/* =>
greatgrand
grand
child
bar
foo
*/
答案 3 :(得分:0)
您可以具有内置了解析功能的递归功能。
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])
}
}
}
我使用OP的foo
对象,这里是它的工作原理
var foo = {
bar:'a',
child:{
b: 'b',
grand:{
greatgrand: {
c:'c'
}
}
}
}
// use this recursive function with a parse funciton
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])
}
}
}
//***
// then apply to the property the task you want, in this case just console
parseObjectProperties(foo, function(prop) {
console.log(prop)
})