default to array when update keys are integers

This commit is contained in:
Andy Brown 2015-08-17 09:15:57 -07:00
parent 7a35404ae1
commit 0b0f6dc376
5 changed files with 61 additions and 7 deletions

View File

@ -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
View 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
View File

@ -0,0 +1,5 @@
function isEmpty(object) {
return !Object.keys(object).length;
}
export default isEmpty;

View File

@ -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);

View File

@ -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);