UNPKG

iteragain

Version:

Javascript Iterable/Iterator/Generator-function utilities.

56 lines 2.18 kB
import ConcatIterator from './ConcatIterator'; import RepeatIterator from './RepeatIterator'; /** * Iterates through all keys in an object. Optionally provides traversal order. Does not support circular references and * will throw a RangeError with max call stack exceeded. * @todo // TODO: Add support for BFS traversal order. */ var ObjectIterator = /** @class */ (function () { function ObjectIterator(object, traversal) { if (traversal === void 0) { traversal = 'post-order-DFS'; } this.traversal = traversal; this.inner = null; this.arr = []; this.push(object); } ObjectIterator.prototype[Symbol.iterator] = function () { return this; }; ObjectIterator.prototype.next = function () { var _a; var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (this.inner) { var next_1 = (_a = this.inner).next.apply(_a, args); if (!next_1.done) return next_1; this.inner = null; return this.next.apply(this, args); } if (!this.arr.length) return { done: true, value: undefined }; var next = this.arr.shift(); // Previous line ensures this is not undefined. if (this.isObject(next[1])) { this.inner = new ConcatIterator(this.traversal === 'post-order-DFS' ? [new ObjectIterator(next[1]), new RepeatIterator(next, 1)] : [new RepeatIterator(next, 1), new ObjectIterator(next[1])]); return this.next.apply(this, args); } return { value: next, done: false }; }; ObjectIterator.prototype.isObject = function (value) { return typeof value === 'object' && value !== null; }; ObjectIterator.prototype.push = function (obj) { for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) { var key = _a[_i]; this.arr.push([key, obj[key], obj]); } }; return ObjectIterator; }()); export { ObjectIterator }; export default ObjectIterator; //# sourceMappingURL=ObjectIterator.js.map