Merge pull request #34 from substantial/default-to-array

Default to array
This commit is contained in:
Andy Brown 2015-08-30 17:00:43 -07:00
commit 12bf952d64
5 changed files with 61 additions and 7 deletions

View File

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

View File

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