Add u.map
This commit is contained in:
parent
750200df76
commit
1a1e2b313a
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
## [unreleased]
|
## [unreleased]
|
||||||
* Add `u.if` to conditionally update objects.
|
* Add `u.if` to conditionally update objects.
|
||||||
|
* Add `u.map` to update all values in an array or object.
|
||||||
|
|
||||||
## [0.3.1]
|
## [0.3.1]
|
||||||
* Actually expose `u.in`.
|
* Actually expose `u.in`.
|
||||||
|
28
README.md
28
README.md
@ -144,6 +144,34 @@ u({
|
|||||||
// => { a: 3 }
|
// => { a: 3 }
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### `u.map(iteratee(, object))`
|
||||||
|
|
||||||
|
If iteratee is a function, map it over the values in `object`.
|
||||||
|
If it is an object, apply it as updates to each value in `object`,
|
||||||
|
which is equivalent to `u.map(u(...), obj)`).
|
||||||
|
|
||||||
|
```js
|
||||||
|
function inc(x) { return x + 1; }
|
||||||
|
u({
|
||||||
|
a: u.map(inc)
|
||||||
|
}, { a: [0, 1] });
|
||||||
|
// => { a: [1, 2] }
|
||||||
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
function inc(x) { return x + 1; }
|
||||||
|
u.map(inc, [0, 1, 2]);
|
||||||
|
// => [1, 2, 3]
|
||||||
|
|
||||||
|
u.map(inc, { a: 0, b: 1, c: 2});
|
||||||
|
// => { a: 1, b: 2, c: 3}
|
||||||
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
u.map({ a: 2 }, [{ a: 0 }, { a: 1 }]);
|
||||||
|
// => [{ a: 2 }, { a: 2 }]
|
||||||
|
```
|
||||||
|
|
||||||
### `u.omit(predicate(, object))`
|
### `u.omit(predicate(, object))`
|
||||||
|
|
||||||
Remove properties. See [`_.omit`](https://lodash.com/docs#omit).
|
Remove properties. See [`_.omit`](https://lodash.com/docs#omit).
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
import update from './update';
|
import freeze from './freeze';
|
||||||
import _in from './in';
|
import _in from './in';
|
||||||
import _if from './if';
|
import _if from './if';
|
||||||
|
import map from './map';
|
||||||
import omit from './omit';
|
import omit from './omit';
|
||||||
import reject from './reject';
|
import reject from './reject';
|
||||||
import withDefault from './withDefault';
|
import withDefault from './withDefault';
|
||||||
import freeze from './freeze';
|
import update from './update';
|
||||||
|
|
||||||
import curry from 'lodash/function/curry';
|
import curry from 'lodash/function/curry';
|
||||||
|
|
||||||
function updateAndFreeze(updates, obj) {
|
function updateAndFreeze(updates, obj) {
|
||||||
@ -16,6 +18,7 @@ const updeep = curry(updateAndFreeze);
|
|||||||
updeep.if = _if;
|
updeep.if = _if;
|
||||||
updeep.in = _in;
|
updeep.in = _in;
|
||||||
updeep.freeze = freeze;
|
updeep.freeze = freeze;
|
||||||
|
updeep.map = map;
|
||||||
updeep.omit = omit;
|
updeep.omit = omit;
|
||||||
updeep.reject = reject;
|
updeep.reject = reject;
|
||||||
updeep.withDefault = withDefault;
|
updeep.withDefault = withDefault;
|
||||||
|
17
lib/map.js
Normal file
17
lib/map.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import curry from 'lodash/function/curry';
|
||||||
|
import mapValues from 'lodash/object/mapValues';
|
||||||
|
import update from './update';
|
||||||
|
|
||||||
|
function map(iteratee, object) {
|
||||||
|
const updater = typeof iteratee === 'function' ?
|
||||||
|
iteratee :
|
||||||
|
val => update(iteratee, val);
|
||||||
|
|
||||||
|
if (Array.isArray(object)) {
|
||||||
|
return object.map(updater);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mapValues(object, updater);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default curry(map);
|
55
test/map-spec.js
Normal file
55
test/map-spec.js
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
import { expect } from 'chai';
|
||||||
|
import u from '../lib';
|
||||||
|
|
||||||
|
describe('u.map', () => {
|
||||||
|
it('applies updates to each item in an array', () => {
|
||||||
|
const obj = [0, 1, 2];
|
||||||
|
const inc = x => x + 1;
|
||||||
|
const result = u.map(inc, obj);
|
||||||
|
|
||||||
|
expect(result).to.eql([1, 2, 3]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('applies updates to each value in an object', () => {
|
||||||
|
const obj = { a: 0, b: 1, c: 2 };
|
||||||
|
const inc = x => x + 1;
|
||||||
|
const result = u.map(inc, obj);
|
||||||
|
|
||||||
|
expect(result).to.eql({ a: 1, b: 2, c: 3 });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('can update with a regular updates object', () => {
|
||||||
|
const obj = [{ a: 0 }, { a: 0 }];
|
||||||
|
const result = u.map({ a: 1 }, obj);
|
||||||
|
|
||||||
|
expect(result).to.eql([{ a: 1 }, { a: 1 }]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('passes the key or index as the second parameter to the iteratee', () => {
|
||||||
|
const obj = {
|
||||||
|
a: { x: 0 },
|
||||||
|
b: [3, 3],
|
||||||
|
};
|
||||||
|
const setToKey = (_, key) => key;
|
||||||
|
const result = u.map(u.map(setToKey), obj);
|
||||||
|
|
||||||
|
expect(result).to.eql( {
|
||||||
|
a: { x: 'x' },
|
||||||
|
b: [0, 1],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('can be partially applied', () => {
|
||||||
|
const obj = {
|
||||||
|
b: [3, 3],
|
||||||
|
};
|
||||||
|
const setToKey = (_, key) => key;
|
||||||
|
const result = u({
|
||||||
|
b: u.map(setToKey),
|
||||||
|
}, obj);
|
||||||
|
|
||||||
|
expect(result).to.eql( {
|
||||||
|
b: [0, 1],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user