diff --git a/snippets/invertKeyValues.md b/snippets/invertKeyValues.md index 2d4302145..e50ea0912 100644 --- a/snippets/invertKeyValues.md +++ b/snippets/invertKeyValues.md @@ -1,17 +1,21 @@ ### invertKeyValues -Inverts the key-value pairs of an object, without mutating it. +Inverts the key-value pairs of an object, without mutating it. The corresponding inverted value of each inverted key is an array of keys responsible for generating the inverted value. If a function is supplied, it is applied to each inverted key. -Use `Object.keys()` and `Array.reduce()` to invert the key-value pairs of an object. +Use `Object.keys()` and `Array.reduce()` to invert the key-value pairs of an object and apply the function provided (if any). +Omit the second argument, `fn`, to get the inverted keys without applying a function to them. ```js -const invertKeyValues = obj => +const invertKeyValues = (obj, fn) => Object.keys(obj).reduce((acc, key) => { - acc[obj[key]] = key; + const val = fn ? fn(obj[key]) : obj[key]; + acc[val] = acc[val] || []; + acc[val].push(key); return acc; }, {}); ``` ```js -invertKeyValues({ name: 'John', age: 20 }); // { 20: 'age', John: 'name' } +invertKeyValues({ a: 1, b: 2, c: 1 }); // { 1: [ 'a', 'c' ], 2: [ 'b' ] } +invertKeyValues({ a: 1, b: 2, c: 1 }, value => 'group' + value); // { group1: [ 'a', 'c' ], group2: [ 'b' ] } ``` diff --git a/tag_database b/tag_database index 6b69c3f7d..17a08401f 100644 --- a/tag_database +++ b/tag_database @@ -85,7 +85,7 @@ initializeArrayWithRangeRight:array,math initializeArrayWithValues:array,math inRange:math intersection:array,math -invertKeyValues:object +invertKeyValues:object,function is:type,array,regexp isAbsoluteURL:string,utility,browser,url isArrayLike:type,array