Moved functions from objectUtils.js to immutabilityHelpers.js

This commit is contained in:
jos 2016-08-13 21:45:09 +02:00
parent 24ab2899dc
commit ebca411384
4 changed files with 15 additions and 144 deletions

View File

@ -19,7 +19,7 @@
"bugs": "https://github.com/josdejong/jsoneditor/issues", "bugs": "https://github.com/josdejong/jsoneditor/issues",
"scripts": { "scripts": {
"build": "gulp", "build": "gulp",
"test": "ava test/*.test.js test/**/*.test.js", "test": "ava test/*.test.js test/**/*.test.js --verbose",
"watch": "gulp watch" "watch": "gulp watch"
}, },
"dependencies": { "dependencies": {

View File

@ -1,7 +1,8 @@
import { h, Component } from 'preact' import { h, Component } from 'preact'
import { setIn, updateIn, getIn, deleteIn, cloneDeep } from './utils/objectUtils' import { cloneDeep } from './utils/objectUtils'
import { compareAsc, compareDesc, last } from './utils/arrayUtils' import { setIn, updateIn, getIn, deleteIn } from './utils/immutabilityHelpers'
import { compareAsc, compareDesc } from './utils/arrayUtils'
import { stringConvert } from './utils/typeUtils' import { stringConvert } from './utils/typeUtils'
import { isObject } from './utils/typeUtils' import { isObject } from './utils/typeUtils'
import bindMethods from './utils/bindMethods' import bindMethods from './utils/bindMethods'

View File

@ -1,5 +1,16 @@
'use strict'; 'use strict';
/**
* Immutability helpers
*
* inspiration:
*
* https://www.npmjs.com/package/seamless-immutable
* https://www.npmjs.com/package/ih
* https://www.npmjs.com/package/mutatis
*/
/** /**
* helper function to get a nested property in an object or array * helper function to get a nested property in an object or array
* *

View File

@ -1,12 +1,6 @@
import { isObject } from './typeUtils' import { isObject } from './typeUtils'
// inspiration:
//
// https://www.npmjs.com/package/seamless-immutable
// https://www.npmjs.com/package/ih
// https://www.npmjs.com/package/mutatis
// TODO: unit test clone // TODO: unit test clone
/** /**
@ -58,138 +52,3 @@ export function cloneDeep (value) {
return value return value
} }
} }
// TODO: unit test getIn
/**
* helper function to get a nested property in an object or array
*
* @param {Object | Array} object
* @param {Array.<string | number>} path
* @return {* | undefined} Returns the field when found, or undefined when the
* path doesn't exist
*/
export function getIn (object, path) {
let value = object
let i = 0
while(i < path.length) {
if (Array.isArray(value) || isObject(value)) {
value = value[path[i]]
}
else {
value = undefined
}
i++
}
return value
}
// TODO: unit test setIn
/**
* helper function to replace a nested property in an object with a new value
* without mutating the object itself.
*
* @param {Object | Array} object
* @param {Array.<string | number>} path
* @param {*} value
* @return {Object | Array} Returns a new, updated object or array
*/
export function setIn (object, path, value) {
if (path.length === 0) {
return value
}
const key = path[0]
let updated
if (typeof key === 'string' && !isObject(object)) {
updated = {} // change into an object
}
else if (typeof key === 'number' && !Array.isArray(object)) {
updated = [] // change into an array
}
else {
updated = clone(object)
}
updated[key] = setIn(updated[key], path.slice(1), value)
return updated
}
// TODO: unit test updateIn
/**
* helper function to replace a nested property in an object with a new value
* without mutating the object itself.
*
* @param {Object | Array} object
* @param {Array.<string | number>} path
* @param {function} callback
* @return {Object | Array} Returns a new, updated object or array
*/
export function updateIn (object, path, callback) {
if (path.length === 0) {
return callback(object)
}
const key = path[0]
let updated
if (typeof key === 'string' && !isObject(object)) {
updated = {} // change into an object
}
else if (typeof key === 'number' && !Array.isArray(object)) {
updated = [] // change into an array
}
else {
updated = clone(object)
}
updated[key] = updateIn(updated[key], path.slice(1), callback)
return updated
}
// TODO: unit test deleteIn
/**
* helper function to delete a nested property in an object
* without mutating the object itself.
*
* @param {Object | Array} object
* @param {Array.<string | number>} path
* @return {Object | Array} Returns a new, updated object or array
*/
export function deleteIn (object, path) {
if (path.length === 0) {
return object
}
if (path.length === 1) {
const key = path[0]
const updated = clone(object)
if (Array.isArray(updated)) {
updated.splice(key, 1)
}
else {
delete updated[key]
}
return updated
}
const key = path[0]
const child = object[key]
if (Array.isArray(child) || isObject(child)) {
const updated = clone(object)
updated[key] = deleteIn(child, path.slice(1))
return updated
}
else {
// child property doesn't exist. just do nothing
return object
}
}