diff --git a/.internal/arrayMap.js b/.internal/arrayMap.js deleted file mode 100644 index 053e044c9..000000000 --- a/.internal/arrayMap.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * A specialized version of `map` for arrays. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - */ -function arrayMap(array, iteratee) { - let index = -1 - const length = array == null ? 0 : array.length - const result = new Array(length) - - while (++index < length) { - result[index] = iteratee(array[index], index, array) - } - return result -} - -export default arrayMap diff --git a/.internal/baseMap.js b/.internal/baseMap.js deleted file mode 100644 index 067398a46..000000000 --- a/.internal/baseMap.js +++ /dev/null @@ -1,22 +0,0 @@ -import baseEach from './baseEach.js' -import isArrayLike from '../isArrayLike.js' - -/** - * The base implementation of `map`. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - */ -function baseMap(collection, iteratee) { - let index = -1 - const result = isArrayLike(collection) ? new Array(collection.length) : [] - - baseEach(collection, (value, key, collection) => { - result[++index] = iteratee(value, key, collection) - }) - return result -} - -export default baseMap diff --git a/map.js b/map.js index dab170051..3711d2b1d 100644 --- a/map.js +++ b/map.js @@ -1,23 +1,10 @@ -import arrayMap from './.internal/arrayMap.js' -import baseMap from './.internal/baseMap.js' - /** - * Creates an array of values by running each element in `collection` thru - * `iteratee`. The iteratee is invoked with three arguments: - * (value, index|key, collection). + * Creates an array of values by running each element of `array` thru `iteratee`. + * The iteratee is invoked with three arguments: (value, index, array). * - * Many lodash methods are guarded to work as iteratees for methods like - * `every`, `filter`, `map`, `mapValues`, `reject`, and `some`. - * - * The guarded methods are: - * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, - * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, - * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, - * `template`, `trim`, `trimEnd`, `trimStart`, and `words` - * - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. + * @since 5.0.0 + * @category Array + * @param {Array} array The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new mapped array. * @example @@ -28,13 +15,16 @@ import baseMap from './.internal/baseMap.js' * * map([4, 8], square) * // => [16, 64] - * - * map({ 'a': 4, 'b': 8 }, square) - * // => [16, 64] (iteration order is not guaranteed) */ -function map(collection, iteratee) { - const func = Array.isArray(collection) ? arrayMap : baseMap - return func(collection, iteratee) +function map(array, iteratee) { + let index = -1 + const length = array == null ? 0 : array.length + const result = new Array(length) + + while (++index < length) { + result[index] = iteratee(array[index], index, array) + } + return result } export default map diff --git a/mapObject.js b/mapObject.js new file mode 100644 index 000000000..96c24ae86 --- /dev/null +++ b/mapObject.js @@ -0,0 +1,29 @@ +/** + * Creates an array of values by running each property of `object` thru + * `iteratee`. The iteratee is invoked with three arguments: (value, key, object). + * + * @since 5.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n + * } + * + * map({ 'a': 4, 'b': 8 }, square) + * // => [16, 64] (iteration order is not guaranteed) + */ +function mapObject(object, iteratee) { + const props = Object.keys(object); + const result = new Array(props.length) + + props.forEach((key, index) => { + result[index] = iteratee(object[key], key, object) + }) + return result +} + +export default mapObject