util.js 1.83 KB
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
}