substantial/updeep

View on GitHub
lib/map.js

Summary

Maintainability
A
0 mins
Test Coverage
import forEach from 'lodash/forEach'
import mapArray from 'lodash/map'
import mapObject from 'lodash/mapValues'
import update from './update'
import wrap from './wrap'

function shallowEqual(object, otherObject) {
  let equal = true
  // eslint-disable-next-line consistent-return
  forEach(otherObject, (value, key) => {
    if (value !== object[key]) {
      equal = false

      // exit early
      return false
    }
  })

  return equal
}

function map(iteratee, object) {
  const updater = typeof iteratee === 'function' ? iteratee : update(iteratee)

  const mapper = Array.isArray(object) ? mapArray : mapObject

  const newObject = mapper(object, updater)
  const equal = shallowEqual(object, newObject)

  return equal ? object : newObject
}

export default wrap(map)