38 lines
1.3 KiB
JavaScript
38 lines
1.3 KiB
JavaScript
|
'use strict';
|
||
|
var InternalStateModule = require('../internals/internal-state');
|
||
|
var createIteratorConstructor = require('../internals/create-iterator-constructor');
|
||
|
var has = require('../internals/has');
|
||
|
var objectKeys = require('../internals/object-keys');
|
||
|
var toObject = require('../internals/to-object');
|
||
|
|
||
|
var OBJECT_ITERATOR = 'Object Iterator';
|
||
|
var setInternalState = InternalStateModule.set;
|
||
|
var getInternalState = InternalStateModule.getterFor(OBJECT_ITERATOR);
|
||
|
|
||
|
module.exports = createIteratorConstructor(function ObjectIterator(source, mode) {
|
||
|
var object = toObject(source);
|
||
|
setInternalState(this, {
|
||
|
type: OBJECT_ITERATOR,
|
||
|
mode: mode,
|
||
|
object: object,
|
||
|
keys: objectKeys(object),
|
||
|
index: 0
|
||
|
});
|
||
|
}, 'Object', function next() {
|
||
|
var state = getInternalState(this);
|
||
|
var keys = state.keys;
|
||
|
while (true) {
|
||
|
if (keys === null || state.index >= keys.length) {
|
||
|
state.object = state.keys = null;
|
||
|
return { value: undefined, done: true };
|
||
|
}
|
||
|
var key = keys[state.index++];
|
||
|
var object = state.object;
|
||
|
if (!has(object, key)) continue;
|
||
|
switch (state.mode) {
|
||
|
case 'keys': return { value: key, done: false };
|
||
|
case 'values': return { value: object[key], done: false };
|
||
|
} /* entries */ return { value: [key, object[key]], done: false };
|
||
|
}
|
||
|
});
|