@snipsonian/core
Version:
Core/base reusable javascript code snippets
25 lines (24 loc) • 1.08 kB
JavaScript
import isObject from '../../is/isObject';
import getPossiblyNestedObjectPropValue from '../filtering/getPossiblyNestedObjectPropValue';
export default function updateObjectField({ obj, fieldToUpdateRef, val, }) {
if (!isObject(obj)) {
return obj;
}
const lastArraySeparator = fieldToUpdateRef.lastIndexOf('[');
const lastObjSeparator = fieldToUpdateRef.lastIndexOf('.');
const splitIndex = Math.max(lastArraySeparator, lastObjSeparator);
if (splitIndex === -1) {
obj[fieldToUpdateRef] = val;
return obj;
}
const parentRef = fieldToUpdateRef.substring(0, splitIndex);
const remainingRef = fieldToUpdateRef.substring(splitIndex + 1);
const childKey = (splitIndex === lastArraySeparator)
? remainingRef.substring(0, remainingRef.indexOf(']'))
: remainingRef;
const getFieldsFromParentRefRegex = /([^.[\]]+)/g;
const pathParts = parentRef.match(getFieldsFromParentRefRegex);
const parent = getPossiblyNestedObjectPropValue(obj, ...pathParts);
parent[childKey] = val;
return obj;
}