UNPKG

1.44 kBJavaScriptView Raw
1'use strict';
2var InternalStateModule = require('../internals/internal-state');
3var createIteratorConstructor = require('../internals/iterator-create-constructor');
4var createIterResultObject = require('../internals/create-iter-result-object');
5var hasOwn = require('../internals/has-own-property');
6var objectKeys = require('../internals/object-keys');
7var toObject = require('../internals/to-object');
8
9var OBJECT_ITERATOR = 'Object Iterator';
10var setInternalState = InternalStateModule.set;
11var getInternalState = InternalStateModule.getterFor(OBJECT_ITERATOR);
12
13module.exports = createIteratorConstructor(function ObjectIterator(source, mode) {
14 var object = toObject(source);
15 setInternalState(this, {
16 type: OBJECT_ITERATOR,
17 mode: mode,
18 object: object,
19 keys: objectKeys(object),
20 index: 0
21 });
22}, 'Object', function next() {
23 var state = getInternalState(this);
24 var keys = state.keys;
25 while (true) {
26 if (keys === null || state.index >= keys.length) {
27 state.object = state.keys = null;
28 return createIterResultObject(undefined, true);
29 }
30 var key = keys[state.index++];
31 var object = state.object;
32 if (!hasOwn(object, key)) continue;
33 switch (state.mode) {
34 case 'keys': return createIterResultObject(key, false);
35 case 'values': return createIterResultObject(object[key], false);
36 } /* entries */ return createIterResultObject([key, object[key]], false);
37 }
38});