traverse: function (obj, query, breakOnFirst) { var queries, queryEngine, results, qLen, q, f; this.reset(); obj = obj || this.subject; results = this.results; query = utils.isArray(query) ? query.toString() : query; if (typeof query === 'string') { queries = [[Query.parse(query, this.options), false]]; } else { queries = utils.keys(query). map(function (src) { return [queryEngine.parse(src), query[src]]; }); } qLen = queries.length; this.traverser. on('leave', function (path, traverser) { var i = 0, node; for (; i < qLen; i++) { node = path.node; q = queries[i]; if (q[0].test(path)) { results.push(node); f = q[1]; if (f) { path.ffwd(); f(path); } if (breakOnFirst) { traverser.break(); break; } } } }). walk(obj); return this; },
map(function (key) { var from, to, by; switch (typeof key) { case 'string': case 'number': return key; case 'object': if (!utils.isArray(key)) { from = key.from || 0; to = key.to + 1; by = key.by || 1; key = utils.range(from, to, by); } return key; } }).