Created immutability function `insertAt`

This commit is contained in:
jos 2016-09-23 11:41:00 +02:00
parent 2a1fabc6ac
commit 54788aa593
3 changed files with 36 additions and 13 deletions

View File

@ -3,7 +3,7 @@
* All functions are pure and don't mutate the JSONData. * All functions are pure and don't mutate the JSONData.
*/ */
import { setIn, updateIn, getIn, deleteIn } from './utils/immutabilityHelpers' import { setIn, updateIn, getIn, deleteIn, insertAt } from './utils/immutabilityHelpers'
import { isObject } from './utils/typeUtils' import { isObject } from './utils/typeUtils'
import isEqual from 'lodash/isEqual' import isEqual from 'lodash/isEqual'
@ -336,18 +336,10 @@ export function add (data, path, value, options) {
let updatedData let updatedData
if (parent.type === 'Array') { if (parent.type === 'Array') {
// TODO: create an immutable helper function to insert an item in an Array updatedData = insertAt(data, dataPath.concat('items', prop), value)
updatedData = updateIn(data, dataPath.concat('items'), (items) => {
const index = parseInt(prop)
const updatedItems = items.slice(0)
updatedItems.splice(index, 0, value)
return updatedItems
})
} }
else { // parent.type === 'Object' else { // parent.type === 'Object'
// TODO: create an immutable helper function to append an item to an Array // TODO: create an immutable helper function to update a property in an Object
updatedData = updateIn(data, dataPath.concat('props'), (props) => { updatedData = updateIn(data, dataPath.concat('props'), (props) => {
const newProp = { name: prop, value } const newProp = { name: prop, value }

View File

@ -150,3 +150,27 @@ export function deleteIn (object, path) {
return updatedObject return updatedObject
} }
} }
/**
* Insert a new item in an array
* @param {Array} array
* @param {Path} path
* @param {*} value
* @return {Array}
*/
export function insertAt (array, path, value) {
const parentPath = path.slice(0, path.length - 1)
const index = path[path.length - 1]
return updateIn(array, parentPath, (items) => {
if (!Array.isArray(items)) {
throw new TypeError('Array expected at path ' + JSON.stringify(parentPath))
}
const updatedItems = items.slice(0)
updatedItems.splice(index, 0, value)
return updatedItems
})
}

View File

@ -1,5 +1,5 @@
import test from 'ava'; import test from 'ava';
import { getIn, setIn, updateIn, deleteIn } from '../src/utils/immutabilityHelpers' import { getIn, setIn, updateIn, deleteIn, insertAt } from '../src/utils/immutabilityHelpers'
test('getIn', t => { test('getIn', t => {
@ -269,3 +269,10 @@ test('deleteIn non existing path', t => {
const updated = deleteIn(obj, ['a', 'b']) const updated = deleteIn(obj, ['a', 'b'])
t.truthy (updated === obj) t.truthy (updated === obj)
}) })
test('insertAt', t => {
const obj = { a: [1,2,3]}
const updated = insertAt(obj, ['ab', '2'], 8)
t.deepEqual(updated, {a: [1,2,8,3]})
})