You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1.3 KiB
37 lines
1.3 KiB
'use strict'; |
|
var InternalStateModule = require('../internals/internal-state'); |
|
var createIteratorConstructor = require('../internals/create-iterator-constructor'); |
|
var hasOwn = require('../internals/has-own-property'); |
|
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 (!hasOwn(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 }; |
|
} |
|
});
|
|
|