Make u.map return same instance if nothing changes
This commit is contained in:
parent
8e82692be2
commit
92ae098659
@ -1,6 +1,7 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
## [unreleased]
|
## [unreleased]
|
||||||
|
* `u.map` will now return the same instance if nothing changes.
|
||||||
* Removed a couple lodash dependencies.
|
* Removed a couple lodash dependencies.
|
||||||
|
|
||||||
## [0.5.0]
|
## [0.5.0]
|
||||||
|
34
lib/map.js
34
lib/map.js
@ -1,15 +1,37 @@
|
|||||||
import mapValues from 'lodash/object/mapValues';
|
|
||||||
import update from './update';
|
import update from './update';
|
||||||
import wrap from './wrap';
|
import wrap from './wrap';
|
||||||
|
|
||||||
function map(iteratee, object) {
|
function forEach(object, callback) {
|
||||||
const updater = update(iteratee);
|
|
||||||
|
|
||||||
if (Array.isArray(object)) {
|
if (Array.isArray(object)) {
|
||||||
return object.map(updater);
|
object.forEach(callback);
|
||||||
|
} else {
|
||||||
|
Object.keys(object).forEach((key) => callback(object[key], key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function clone(object) {
|
||||||
|
if (Array.isArray(object)) {
|
||||||
|
return [...object];
|
||||||
}
|
}
|
||||||
|
|
||||||
return mapValues(object, updater);
|
return { ...object };
|
||||||
|
}
|
||||||
|
|
||||||
|
function map(iteratee, object) {
|
||||||
|
const updater = update(iteratee);
|
||||||
|
let newObject;
|
||||||
|
|
||||||
|
forEach(object, (value, index) => {
|
||||||
|
const newValue = updater(value, index);
|
||||||
|
|
||||||
|
if (newValue === value) return;
|
||||||
|
|
||||||
|
newObject = newObject || clone(object);
|
||||||
|
|
||||||
|
newObject[index] = newValue;
|
||||||
|
});
|
||||||
|
|
||||||
|
return newObject || object;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default wrap(map);
|
export default wrap(map);
|
||||||
|
@ -25,6 +25,19 @@ describe('u.map', () => {
|
|||||||
expect(result).to.eql([{ a: 1 }, { a: 1 }]);
|
expect(result).to.eql([{ a: 1 }, { a: 1 }]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('returns the same object if no updates are made', () => {
|
||||||
|
const array = [0, 1];
|
||||||
|
const ident = x => x;
|
||||||
|
let result = u.map(ident, array);
|
||||||
|
|
||||||
|
expect(result).to.equal(array);
|
||||||
|
|
||||||
|
const object = { a: 0 };
|
||||||
|
result = u.map(ident, object);
|
||||||
|
|
||||||
|
expect(result).to.equal(object);
|
||||||
|
});
|
||||||
|
|
||||||
it('passes the key or index as the second parameter to the iteratee', () => {
|
it('passes the key or index as the second parameter to the iteratee', () => {
|
||||||
const object = {
|
const object = {
|
||||||
a: { x: 0 },
|
a: { x: 0 },
|
||||||
|
Loading…
Reference in New Issue
Block a user