See Recursive Iterator.
Traverses the tree (javascript object) recursively and calls function for each node key
ES5 Object.keys(), Array.prototype.indexOf()
Object.traverse(object /*{Object|Array}*/, callback, [context, [mode=0, [ignoreCircularReferences=false, [maxDepth=100]]]]);
Object.traverse(tree, function(node, value, key, path, depth) {
// node is current node
// value is node[key] value
// key is key of node
// path is path to node
// depth is current depth
});
By default method cross of tree is vertical mode=0
:
var object = {
foo: {
bar: {
number: 1,
string: 'walker',
array: [
undefined,
NaN
],
date: new Date()
}
}
};
Object.traverse(object, function(node, value, key, path, depth) {
console.log(path.join('.'), value);
});
// foo Object {bar: Object}
// foo.bar Object {number: 1, string: "walker", array: Array[2], date: Sat Nov 22 2014 14:05:45 GMT+0300 (Московское время (зима))}
// foo.bar.array [undefined, NaN]
// foo.bar.array.0 undefined
// foo.bar.array.1 NaN
// foo.bar.date Sat Nov 22 2014 14:05:45 GMT+0300 (Московское время (зима))
// foo.bar.number 1
// foo.bar.string walker
You can change it on horizontal by passing the mode=1
:
var object = {
foo: {
bar: {
number: 1,
string: 'walker',
array: [
undefined,
NaN
],
date: new Date()
}
}
};
Object.traverse(object, function(node, value, key, path, depth) {
console.log(path.join('.'), value);
}, null, 1);
// foo Object {bar: Object}
// foo.bar Object {number: 1, string: "walker", array: Array[2], date: Sat Nov 22 2014 14:17:52 GMT+0300 (Московское время (зима))}
// foo.bar.array [undefined, NaN]
// foo.bar.date Sat Nov 22 2014 14:17:52 GMT+0300 (Московское время (зима))
// foo.bar.number 1
// foo.bar.string walker
// foo.bar.array.0 undefined
// foo.bar.array.1 NaN
Object.traverse(object, function(node, value, key, path, depth) {
// If "value" is {Object|Array}, then "return true" will prevent step into this object
return true;
});
Object.traverse(object, function(node, value, key, path, depth) {
return false;
});
By default, if detected circular reference then will throw an exception:
var object = {
foo: {
bar: undefined,
number: 1
}
};
object.foo.bar = object;
Object.traverse(object, function(node, value, key, path, depth) {
console.log(path.join('.'), value);
});
// foo Object {bar: Object, number: 1}
// foo.bar Object {foo: Object}
// Uncaught Error: Circular reference
You can change this behaviour by passing ignoreCircularReferences=true
:
var object = {
foo: {
bar: undefined,
number: 1
}
};
object.foo.bar = object;
Object.traverse(object, function(node, value, key, path, depth) {
console.log(path.join('.'), value);
}, null, null, true);
// foo Object {bar: Object, number: 1}
// foo.bar Object {foo: Object}
// foo.number 1
By default maxDepth
is 100
. Minimum depth is 0
. Each like cycle:
var object = {
foo: {
bar: undefined,
number: 1
}
};
Object.traverse(object, function(node, value, key, path, depth) {
console.log(path.join('.'), value);
}, null, null, null, 0);
// foo Object {bar: Object, number: 1}