Skip to content
This repository was archived by the owner on Feb 20, 2019. It is now read-only.

Commit 695b8b9

Browse files
Ravi SoniKent C. Dodds
Ravi Soni
authored and
Kent C. Dodds
committed
feat(makeObjectIterable): Add makeObjectIterable function (#182)
1 parent 02fedc8 commit 695b8b9

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

src/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import isLeapYear from './leap-year'
6464
import removeElementFromArray from './removeElementFromArray'
6565
import generatePassword from './generate-password'
6666
import tail from './tail'
67+
import makeObjectIterable from './makeObjectIterable'
6768

6869
export {
6970
reverseArrayInPlace,
@@ -132,4 +133,5 @@ export {
132133
removeElementFromArray,
133134
generatePassword,
134135
tail,
136+
makeObjectIterable,
135137
}

src/makeObjectIterable.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
export default makeObjectIterable
2+
3+
/**
4+
* Original Source: https://stackoverflow.com/questions/48132121/how-to-make-iterable-object-in-javascript
5+
*
6+
* Makes a regular object iterable so that it can be used in constructs such
7+
* as a for-of loop.
8+
*
9+
* @param {Object} obj - object on which iteration is desired
10+
* @returns {Object} - returns the same object
11+
*/
12+
function makeObjectIterable(obj) {
13+
Object.defineProperty(obj, Symbol.iterator, {
14+
writable: false,
15+
enumerable: false,
16+
configurable: true,
17+
value: function iteratorCreator() {
18+
let idx = 0
19+
const ks = Object.keys(obj)
20+
return {
21+
next: function nextElement() {
22+
return {
23+
value: obj[ks[idx++]],
24+
done: idx > ks.length,
25+
}
26+
},
27+
}
28+
},
29+
})
30+
31+
return obj
32+
}

test/makeObjectIterable.test.js

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import test from 'ava'
2+
import {makeObjectIterable} from '../src'
3+
4+
test('check if the iterator returns correct values ', t => {
5+
const myObj = {a: 1, b: 2, c: 'XKCD'}
6+
const out = makeObjectIterable(myObj)
7+
const a = []
8+
const b = []
9+
Object.keys(myObj).map(item => a.push(myObj[item]))
10+
for (const v of out) {
11+
b.push(v)
12+
}
13+
t.deepEqual(a, b)
14+
})

0 commit comments

Comments
 (0)