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';
|
||||
|
||||
function isEmpty(object) {
|
||||
return !Object.keys(object).length;
|
||||
}
|
||||
import isEmpty from './util/isEmpty';
|
||||
import defaultObject from './util/defaultObject';
|
||||
|
||||
function reduce(object, callback, initialValue) {
|
||||
return Object.keys(object).reduce((acc, key) => {
|
||||
@ -64,9 +62,7 @@ function update(updates, object, ...args) {
|
||||
return updates;
|
||||
}
|
||||
|
||||
const defaultedObject = (typeof object === 'undefined' || object === null) ?
|
||||
{} :
|
||||
object;
|
||||
const defaultedObject = defaultObject(object, updates);
|
||||
|
||||
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] });
|
||||
});
|
||||
|
||||
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', () => {
|
||||
const object = { a: { b: 0 } };
|
||||
const result = u.updateIn('a.b')(3)(object);
|
||||
|
@ -42,6 +42,18 @@ describe('updeep', () => {
|
||||
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', () => {
|
||||
const object = [];
|
||||
const result = u({ 0: 3 }, object);
|
||||
|
Loading…
Reference in New Issue
Block a user