Skip to content

Commit 84f241c

Browse files
committed
add inverse
1 parent a55b5e0 commit 84f241c

File tree

4 files changed

+124
-2
lines changed

4 files changed

+124
-2
lines changed

index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ module.exports = extendObjectPrototype
1616
function extendObjectPrototype (hideWarnings) {
1717
[
1818
'every',
19+
'inverse',
1920
'filter',
20-
'find',
2121
'findKey',
22+
'find',
2223
'forEach',
23-
'map',
2424
'mapKeys',
25+
'map',
2526
'reduce',
2627
'some'
2728
].forEach(function (methodName) {

inverse.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* @module object-loops/inverse
3+
*/
4+
var isInteger = require('101/is-integer')
5+
var reduce = require('./reduce')
6+
7+
/**
8+
* Creates a new object with keys and values swapped.
9+
* @function module:object-loops/inverse
10+
* @param {object} [obj] - object to inverse keys and values, not accepted if being used directly on Object.prototype
11+
* @returns {object} newly created object with inverseped values
12+
*/
13+
module.exports = inverse
14+
15+
function inverse (obj) {
16+
if (Array.isArray(obj)) {
17+
var valsAreInts = obj.every(isInteger)
18+
return obj.reduce(flip, valsAreInts ? [] : {})
19+
}
20+
if (typeof obj !== 'object' && typeof obj !== 'function') {
21+
throw new TypeError(obj + ' must be an object')
22+
}
23+
return reduce(obj, flip, {})
24+
}
25+
26+
function flip (inversed, val, key) {
27+
inversed[val] = key
28+
return inversed
29+
}

test/fixtures/reset-object-prototype.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var methodNames = [
22
'every',
3+
'inverse',
34
'filter',
45
'find',
56
'findKey',

test/test-inverse.js

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
var Code = require('code')
2+
var Lab = require('lab')
3+
var lab = exports.lab = Lab.script()
4+
5+
var describe = lab.describe
6+
var it = lab.it
7+
var before = lab.before
8+
var after = lab.after
9+
var expect = Code.expect
10+
11+
var inverse = require('../inverse')
12+
13+
describe('inverse', function () {
14+
describe('prototype', function () {
15+
before(function (done) {
16+
require('../index')()
17+
done()
18+
})
19+
after(require('./fixtures/reset-object-prototype'))
20+
it('should iterate through all the key-value pairs in the object', function (done) {
21+
var obj = {
22+
foo: 1,
23+
bar: 2,
24+
baz: 3
25+
}
26+
var ret = obj.inverse()
27+
expect(ret).to.deep.equal({
28+
'1': 'foo',
29+
'2': 'bar',
30+
'3': 'baz'
31+
})
32+
done()
33+
})
34+
})
35+
describe('require', function () {
36+
it('should iterate through all the key-value pairs in the object', function (done) {
37+
var obj = {
38+
foo: 1,
39+
bar: 2,
40+
baz: 3
41+
}
42+
var ret = inverse(obj)
43+
expect(ret).to.deep.equal({
44+
'1': 'foo',
45+
'2': 'bar',
46+
'3': 'baz'
47+
})
48+
done()
49+
})
50+
it('should iterate through all the key-value pairs in an array (integer values)', function (done) {
51+
var arr = [
52+
2,
53+
4,
54+
6
55+
]
56+
var ret = inverse(arr)
57+
expect(ret).to.deep.equal([
58+
undefined,
59+
undefined,
60+
0,
61+
undefined,
62+
1,
63+
undefined,
64+
2
65+
])
66+
done()
67+
})
68+
it('should iterate through all the key-value pairs in an array (non-integer values)', function (done) {
69+
var arr = [
70+
2,
71+
'yo',
72+
6
73+
]
74+
var ret = inverse(arr)
75+
expect(ret).to.deep.equal({
76+
'2': 0,
77+
'yo': 1,
78+
'6': 2
79+
})
80+
done()
81+
})
82+
describe('errors', function () {
83+
it('should throw an error if obj must be an object', function (done) {
84+
var obj = 'notObject'
85+
var fn = inverse.bind(null, obj)
86+
expect(fn).to.throw(/must be an object/)
87+
done()
88+
})
89+
})
90+
})
91+
})

0 commit comments

Comments
 (0)