export const cloneDeep = (obj) => { if (typeof obj !== 'object') { return obj; } if (!obj) { return obj; } if (obj instanceof Date) { return new Date(obj); } if (obj instanceof RegExp) { return new RegExp(obj); } if (obj instanceof Function) { return obj; } let newObj; if (obj instanceof Array) { newObj = []; for(let i = 0, len = obj.length; i < len; i++){ newObj.push(cloneDeep(obj[i])); } return newObj; } newObj = {}; for(let key in obj) { if (obj.hasOwnProperty(key)) { if (typeof obj[key] !== 'object') { newObj[key] = obj[key]; } else { newObj[key] = cloneDeep(obj[key]); } } } return newObj; }; export const get = (obj, dotSeparatedKeys) => { if (dotSeparatedKeys !== undefined && typeof dotSeparatedKeys !== 'string') return undefined; if (typeof obj !== 'undefined' && typeof dotSeparatedKeys === 'string') { // split on ".", "[", "]", "'", """ and filter out empty elements const splitRegex = /[.\[\]'"]/g; // eslint-disable-line no-useless-escape const pathArr = dotSeparatedKeys.split(splitRegex).filter(k => k !== ''); // eslint-disable-next-line no-param-reassign, no-confusing-arrow obj = pathArr.reduce((o, key) => (o && o[key] !== undefined ? o[key] : undefined), obj); } return obj; }; export const set = (obj, dotSeparatedKeys, value) => { const splitRegex = /[.\[\]'"]/g; const pathArr = dotSeparatedKeys.split(splitRegex).filter(k => k !== ''); const key = pathArr.pop(); pathArr.reduce((o, k) => { if (o && o[k] === undefined || o[k] === null) { o[k] = !isNaN(Number(key)) ? [] : {} } return o[k] }, obj)[key] = value // pathArr.reduce((o, key) => (o && o[key] !== 'undefined' ? o[key] : undefined), obj)[key] = value }; export default { cloneDeep, get, set }