default to array when update keys are integers
This commit is contained in:
parent
7a35404ae1
commit
0b0f6dc376
@ -1,8 +1,6 @@
|
|||||||
import wrap from './wrap';
|
import wrap from './wrap';
|
||||||
|
import isEmpty from './util/isEmpty';
|
||||||
function isEmpty(object) {
|
import defaultObject from './util/defaultObject';
|
||||||
return !Object.keys(object).length;
|
|
||||||
}
|
|
||||||
|
|
||||||
function reduce(object, callback, initialValue) {
|
function reduce(object, callback, initialValue) {
|
||||||
return Object.keys(object).reduce((acc, key) => {
|
return Object.keys(object).reduce((acc, key) => {
|
||||||
@ -64,9 +62,7 @@ function update(updates, object, ...args) {
|
|||||||
return updates;
|
return updates;
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultedObject = (typeof object === 'undefined' || object === null) ?
|
const defaultedObject = defaultObject(object, updates);
|
||||||
{} :
|
|
||||||
object;
|
|
||||||
|
|
||||||
const resolvedUpdates = resolveUpdates(updates, defaultedObject);
|
const resolvedUpdates = resolveUpdates(updates, defaultedObject);
|
||||||
|
|
||||||
|
35
lib/util/defaultObject.js
Normal file
35
lib/util/defaultObject.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import isEmpty from './isEmpty';
|
||||||
|
|
||||||
|
function isInt(value) {
|
||||||
|
if (isNaN(value)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const x = parseFloat(value);
|
||||||
|
return (x | 0) === x;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isArrayUpdate(updates) {
|
||||||
|
for (const updateKey of Object.keys(updates)) {
|
||||||
|
if (!isInt(updateKey)) { return false; }
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function arrayOrObject(updates) {
|
||||||
|
if (!isEmpty(updates) && isArrayUpdate(updates)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
function defaultObject(object, updates) {
|
||||||
|
if (typeof object === 'undefined' || object === null) {
|
||||||
|
return arrayOrObject(updates);
|
||||||
|
}
|
||||||
|
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default defaultObject;
|
5
lib/util/isEmpty.js
Normal file
5
lib/util/isEmpty.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
function isEmpty(object) {
|
||||||
|
return !Object.keys(object).length;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default isEmpty;
|
@ -27,6 +27,12 @@ describe('u.updateIn', () => {
|
|||||||
expect(result).to.eql({ a: [0, 3, 0] });
|
expect(result).to.eql({ a: [0, 3, 0] });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('can create array if all keys are numbers', () => {
|
||||||
|
const result = u.updateIn('a.0', 3, null);
|
||||||
|
|
||||||
|
expect(result).to.eql({ a: [3] });
|
||||||
|
});
|
||||||
|
|
||||||
it('can be partially applied', () => {
|
it('can be partially applied', () => {
|
||||||
const object = { a: { b: 0 } };
|
const object = { a: { b: 0 } };
|
||||||
const result = u.updateIn('a.b')(3)(object);
|
const result = u.updateIn('a.b')(3)(object);
|
||||||
|
@ -42,6 +42,18 @@ describe('updeep', () => {
|
|||||||
expect(u(null, {})).to.be.null;
|
expect(u(null, {})).to.be.null;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('can create array if all keys are numbers', () => {
|
||||||
|
const result = u({ 0: 'hi', '1': 'world' }, null);
|
||||||
|
|
||||||
|
expect(result).to.eql(['hi', 'world']);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not create array if any key is not number', () => {
|
||||||
|
const result = u({ 0: 'hi', '1a': 'world' }, null);
|
||||||
|
|
||||||
|
expect(result).to.eql({ 0: 'hi', '1a': 'world' });
|
||||||
|
});
|
||||||
|
|
||||||
it('can add an element to an array', () => {
|
it('can add an element to an array', () => {
|
||||||
const object = [];
|
const object = [];
|
||||||
const result = u({ 0: 3 }, object);
|
const result = u({ 0: 3 }, object);
|
||||||
|
Loading…
Reference in New Issue
Block a user