From efb1a2c8e090daf55552cb66727f46defadebff2 Mon Sep 17 00:00:00 2001 From: Scott Shepherd Date: Thu, 5 Dec 2013 09:12:38 -0500 Subject: [PATCH] added oneToMany option to _.invert() --- lodash.js | 16 +++++++++++++--- test/test.js | 6 ++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lodash.js b/lodash.js index 69b877057..527eba2bd 100644 --- a/lodash.js +++ b/lodash.js @@ -2540,21 +2540,31 @@ * @memberOf _ * @category Objects * @param {Object} object The object to invert. + * @param {boolean} oneToMany allow multiple values for each key in the inverted result * @returns {Object} Returns the created inverted object. * @example * * _.invert({ 'first': 'fred', 'second': 'barney' }); * // => { 'fred': 'first', 'barney': 'second' } + * + * _.invert({ 'first': 'fred', 'second': 'barney', 'third': 'fred' }, true); + * // => { 'fred': ['first', 'third'], 'barney': ['second'] } */ - function invert(object) { + function invert(object, oneToMany) { var index = -1, props = keys(object), length = props.length, result = {}; while (++index < length) { - var key = props[index]; - result[object[key]] = key; + var key = props[index], + value = object[key]; + if (oneToMany) { + result[value] = result[value] || []; + result[value].push(key); + } else { + result[value] = key; + } } return result; } diff --git a/test/test.js b/test/test.js index 7036941f0..4f7212cbd 100644 --- a/test/test.js +++ b/test/test.js @@ -3306,6 +3306,12 @@ var object = { '0': 'a', '1': 'b', 'length': 2 }; deepEqual(_.invert(object), { 'a': '0', 'b': '1', '2': 'length' }); }); + + test('should accept the one-to-many flag', 1, function() { + var object = { '0': 'a', '1': 'b', '2': 'a' }; + deepEqual(_.invert(object, true), { 'a': ['0', '2'], 'b': ['1'] }); + }); + }()); /*--------------------------------------------------------------------------*/