美文网首页
js常用方法库

js常用方法库

作者: Biao_349d | 来源:发表于2020-07-15 11:24 被阅读0次

/*
exp: var obj1 = { a: { name: 'a-1', headers: { token: '1', cookie: '2' } }, b: 'b', c: 'c' }
var obj2= { a: { name: '1-2', headers: { token: '2', oppenid: 'oppenid' } } }
JSON.stringify(deepMerge(obj1, obj2), null, 2)
"{
"a": {
"name": "1-2",
"headers": {
"token": "2",
"cookie": "2",
"oppenid": "oppenid"
}
},
"b": "b",
"c": "c"
}"

@desc: 深合并对象
*/

export const deepMerge = (obj1, obj2) => {
  let key
  for (key in obj2) {
    // 如果target(也就是obj1[key])存在,且是对象的话再去调用deepMerge,否则就是obj1[key]里面没这个对象,需要与obj2[key]合并
    obj1[key] =
      obj1[key] && obj1[key].toString() === '[object Object]'
        ? deepMerge(obj1[key], obj2[key])
        : (obj1[key] = obj2[key])
  }
  return obj1
}


// 驼峰  下划线  互相转换
// @params: isTrue  是否转换成驼峰;
// @params: name<string> 字符串名称;
export const toHumpLine = (name, isTrue) => {
  // 下划线转换驼峰
  function toHump(name) {
    // eslint-disable-next-line no-useless-escape
    return name.replace(/\_(\w)/g, function(all, letter) {
      return letter.toUpperCase()
    })
  }
  // 驼峰转换下划线
  function toLine(name) {
    return name.replace(/([A-Z])/g, '_$1').toLowerCase()
  }
  if (isTrue) {
    return toHump(name)
  } else {
    return toLine(name)
  }
}

// 数组内的对象的key转换成驼峰;
function _arrayKeyToHump(arr, isTrue = true) {
  return arr.map(item => {
    if (item && Array.isArray(item)) {
      item = arrayKeyToHump(item, isTrue)
    } else if (item && typeof item === 'object') {
      item = objectKeyToHump(item, isTrue)
    }
    return item === null ? '' : item
  })
}

// 对象内的key转换成驼峰;
function _objectKeyToHump(obj, isTrue = true) {
  const itemCopy = {}
  for (const key in obj) {
    let value = obj[key]
    if (value && Array.isArray(value)) {
      value = arrayKeyToHump(value, isTrue)
    } else if (value && typeof value === 'object') {
      value = objectKeyToHump(value, isTrue)
    }

    itemCopy[toHumpLine(key, isTrue)] = value === null ? '' : value
  }
  return itemCopy
}

export const arrayKeyToHump = _arrayKeyToHump
export const objectKeyToHump = _objectKeyToHump
export const namespace = function() {
  const a = arguments
  let o = null
  let i
  let j
  let d
  for (i = 0; i < a.length; i = i + 1) {
    d = a[i].split('.')
    o = this
    for (j = 0; j < d.length; j = j + 1) {
      o[d[j]] = o[d[j]] || {}
      o = o[d[j]]
    }
  }
  return o
}
export const parseQueryString = url => {
  url = url == null ? window.location.href : url
  if (url.indexOf('?') === -1) {
    return {}
  }
  const search = url.substring(url.lastIndexOf('?') + 1)
  if (!search) {
    return {}
  }
  return JSON.parse(
    '{"' +
      decodeURIComponent(search)
        .replace(/"/g, '\\"')
        .replace(/&/g, '","')
        .replace(/=/g, '":"') +
      '"}'
  )
}

// 选择文件功能
export const upload = (callback = () => {}, opts = {}) => {
  const input = document.createElement('input')
  input.setAttribute('type', 'file')
  input.setAttribute('accept', opts.accept || '')
  input.setAttribute('multiple', opts.multiple || false)
  input.addEventListener('change', function(e) {
    const files = e.target.files
    const formDatas = Array.prototype.map.call(files, file => {
      const formData = new FormData()
      formData.append(opts.name || 'file', file)

      return formData
    })
    callback(formDatas)
    input.remove()
  })
  document.getElementsByTagName('body')[0].appendChild(input)
  input.click()
}

// 跳转,下载
export const navigateTo = (url, type = 'normal', params = {}) => {
  const alink = document.createElement('a')
  alink.setAttribute('href', url)
  alink.setAttribute('target', '_blank')
  if (type === 'donwload') {
    alink.setAttribute('download', params.fileName || true)
  }
  document.getElementsByTagName('body')[0].appendChild(alink)
  alink.click()
  alink.remove()
}


export const componentTreeData = obj => {
  const id = obj.id || 'id'
  const parentId = obj.parentId || 'parentCode'
  // const eleValLevel = obj.level || 'eleValLevel'
  const arr = obj.arr || []
  // 数组转tree
  function composeTree(list = []) {
    const data = JSON.parse(JSON.stringify(list)) // 浅拷贝不改变源数据
    const result = []
    if (!Array.isArray(data)) {
      return result
    }
    data.forEach(item => {
      delete item.children
    })
    const map = {}
    data.forEach(item => {
      map[item[id]] = item
    })
    data.forEach(item => {
      const parent = map[item[parentId]]
      if (parent && item[parentId]) {
        ;(parent.children || (parent.children = [])).push(item)
      } else {
        result.push(item)
      }
    })
    return result
  }
  return composeTree(arr)
}

@desc vue 遍历渲染组件


const disabledAddDefaultTag = ['button', 'u-button', 'input', 'u-input'];
export default {
  name: 'expand',
  functional: true,
  props: {
    row: Object,
    render: Function,
    index: Number,
    column: {
      type: Object,
      default: null,
    },
    options: Object,
    defaultTag: {
      type: String,
      default: 'div',
    },
  },
  render: (h, ctx) => {
    const defaultTag = ctx.props.defaultTag;
    const uiChildrenName = ctx.parent.$store.state.uiChildrenName;
    // 当需要创建子元素的时候, 创建子元素。
    function createDefaultTag(node) {
      if (disabledAddDefaultTag.indexOf(node.name) !== -1) {
        return [];
      }
      return h(ctx.props.options.insteadTag || defaultTag, {
        ...node,
      });
    }
    // 判断是否包含不渲染子元素的标签, 如果是, 则不渲染子元素,依旧渲染原本的值(innerHTML, innerText)
    function getIsCreateInnerHtml(node, nativeNode) {
      if (disabledAddDefaultTag.indexOf(node.name) !== -1) {
        return nativeNode;
      }
      return node;
    }
    // 渲染子组件
    const getChildrenTextContent = function (children) {
      if (!Array.isArray(children)) {
        return [];
      }
      return children.map(function (node) {
        const options2 = JSON.parse(JSON.stringify(node));

        if (options2.domProps) {
          delete options2.domProps.innerHTML;
          delete options2.domProps.innerText;
        }
        return h(
          node.name,
          {
            // ...options2,
            ...getIsCreateInnerHtml(options2, node),
          },
          [
            node[uiChildrenName]
              ? []
                  .concat(createDefaultTag(node))
                  .concat(getChildrenTextContent(node[uiChildrenName]))
              : [].concat(createDefaultTag(node)),
          ]
        );
      });
    };
    const options2 = JSON.parse(JSON.stringify(ctx.props.options));
    if (options2.domProps) {
      delete options2.domProps.innerHTML;
      delete options2.domProps.innerText;
    }
    return h(
      ctx.props.options.name,
      {
        // ...options2,
        ...getIsCreateInnerHtml(options2, ctx.props.options),
      },
      [
        // 当有子标签, 会将父标签的内容放到子标签进行渲染,然后再在后面插入子标签。
        // h(ctx.props.options.insteadTag || defaultTag, {
        //   ...ctx.props.options,
        // }),
        [].concat(createDefaultTag(ctx.props.options)),
        // ...getChildrenTextContent(ctx.props.options[children]),  // 加了他会导致重复渲染
        ...(ctx.children || []), // 不加他不渲染子组件
      ]
    );
  },
};

/*
 * @Author: your name
 * @Date: 2020-04-21 09:35:27
 * @LastEditTime: 2020-04-25 20:06:37
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \dragUI-master\src\components\common\componentContainer\base.js
 */
import expand from '@/src/components/common/expand.js';
// import draggable from '@/src/common/js/vuedraggable';
import draggable from 'vuedraggable';
const children = 'children';
const outtime = 1000;
let isSend = true;
const addDiv = {
  name: 'div',
  style: {
    color: 'red',
    fontSize: '14px',
    display: 'block',
    padding: '10px',
    border: '1px solid red',
  },
  class: {
    addcomponent: true,
  },
  // attr: {
  // isAdd: true
  // },
  // DOM 属性
  domProps: {
    // innerHTML: 'blue-view-dev2',
  },
};
export default {
  name: 'expand2',
  functional: true,
  components: { draggable, expand },
  props: {
    myList: {
      type: [Array],
      default: () => {
        return () => {};
      },
    },
    other: {
      type: Object,
      default: () => {
        return {};
      },
    },
    selectTagCallback: {
      type: Function,
      default: () => {},
    },
    draggableListeners: {
      type: Object,
      default: () => {
        return {
          end: function() {},
          add: function() {},
          update: function() {},
          remove: function() {},
          move: function() {},
          clone: function() {},
          change: function() {},
        }
      }
    }
  },
  render: (h, ctx) => {
    const uiChildrenName = ctx.parent.$store.state.uiChildrenName;
    console.log(uiChildrenName);
    const self = this;
    const myList = ctx.props.myList || [];
    const other = ctx.props.other;
    const draggableListeners = ctx.props.draggableListeners
    const handleInput =
      (ctx.listeners && ctx.listeners.input) || function () {};
    function getexpand(item, callback) {
      let children = [];
      if (item[uiChildrenName] && Array.isArray(item[uiChildrenName])) {
        children = item[uiChildrenName];
      }
      return h(
        'expand',
        {
          props: {
            options: {
              ...item,
              on: Object.assign((item.on || {}), {
                  "click":function (event) {
                    console.log('expand--click')
                    console.log(item)
                    ctx.props.selectTagCallback(item);
                  }
              } )
            },
          },
        },
        [
          getChildrenTextContent(children, (arr) => {
            // 接受到子层的更改, 并传递给父层
            callback &&
              callback({
                ...item,
                [uiChildrenName]: arr,
              });
          }),
        ]
      );
    }
    function getChildrenTextContent(myList, callback) {
      if (!Array.isArray(myList)) {
        console.log('没有' + uiChildrenName);
        return [];
      }
      const myListCopy = [...myList];
      let children = myList.map((item, index) => {
        return getexpand(item, (resItem) => {
          // 接受到子层的修改, 并传递给父层
          myListCopy[index] = resItem;
          console.log('子集修改了,我监听到了', resItem);
          callback && callback(myListCopy);
        });
      });
      // // 子层全部修改完成候, 传递新的值给父层
      // callback && callback(myListCopy);
      return h(
        'draggable',
        {
          props: {
            value: myList,
            ...other,
          },
          style: {},
          class: {
            candraggable: true,
          },
          on: {
            input: (e, ...args) => {
              // console.log(this);
              // myList = e;
              // self.$emit('input', e);
              // 获取最新移动的值,并传递给到上一层
              console.log('列表被动了,我监听到了', e, args);
              if (isSend) {
                callback && callback(e);
                isSend = false;
                // 因为会报错: Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node., 所以我强制用先修改的内容替代错误后的信息。
                setTimeout(() => {
                  isSend = true;
                }, outtime);
              }
            },
            end: (evt) => {
              console.log('end');
              console.log(evt);
              draggableListeners.end && draggableListeners.end(evt)
            },
            add: (evt) => {
              console.log('add');
              console.log(evt);
              draggableListeners.add && draggableListeners.add(evt)
            },
            update: (evt) => {
              console.log('update');
              console.log(evt);
              draggableListeners.update && draggableListeners.update(evt)
            },
            remove: (evt) => {
              console.log('remove');
              console.log(evt);
              draggableListeners.remove && draggableListeners.remove(evt)
            },
            move: (evt) => {
              console.log('move');
              console.log(evt);
              draggableListeners.move && draggableListeners.move(evt)
            },
            clone: (evt) => {
              console.log('clone');
              console.log(evt);
              draggableListeners.clone && draggableListeners.clone(evt)
            },
            change: function (evt) {
              console.log('change');
              console.log(evt)
              draggableListeners.change && draggableListeners.change(evt)
            },
            filter: function (evt) {
              console.log('filter');
              console.log(evt)
              draggableListeners.change && draggableListeners.filter(evt)
            },
          },
        },
        [...children]
      );
    }
    return getChildrenTextContent(myList, (arr) => {
      // setTimeout(() => {
      console.log('最终修改了,我监听到了', arr);
      handleInput && handleInput(arr);
      // }, 500);
    });
  },
  updated: function () {
    this.$nextTick(function () {
      // Code that will run only after the
      // entire view has been re-rendered
    });
  },
};

let uiId = 1;
let selectedUiIds = [];
let selectedUiIdObj = {};
// 深层添加id
export const deepAddId = (arr, childrenName = 'children') => {
  return arr.map((item) => {
    item.uiId = 'uid' + uiId++;
    if (Array.isArray(item[childrenName]) && item[childrenName].length) {
      item[childrenName] = deepAddId(item[childrenName]);
    }
    return item;
  });
};

替换指定数组内的值

export const replaceArrItem = (arr, item, childrenName = 'children') => {
  for (let key in arr) {
    const arrItem = arr[key];
    if (item.uiId === arrItem.uiId) {
      arr[key] = item;
      break;
    } else if (Array.isArray(arrItem[childrenName])) {
      arr[key][childrenName] = replaceArrItem(arrItem[childrenName], item);
    }
  }
  return arr;
};
/*
desc: 树结构扁平化
*/
export const flatten = (data, uiChildrenName = 'children') => {
  return data.reduce(
    (arr, obj) =>
      arr.concat(
        [{ ...obj }],
        flatten(obj[uiChildrenName] || [], uiChildrenName)
      ),
    []
  );
};
/*
 * @Author: your name
 * @Date: 2020-05-20 10:49:26
 * @LastEditTime: 2020-06-02 14:44:50
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \tydbweb\src\utils\index.js
 */
import moment from 'moment';
export const filterData = (state, stateName) =>
  typeof state === 'object' ? state[stateName] : state;

const datyTimes = 86400000; // 一天转换的毫秒数

export const deleObj = (obj, key) => {
  let obj2 = Object.assign({}, obj);
  delete obj2[key];
  return obj2;
};

export const validatorPhone = function () {
  return (rule, value, callback) => {
    const form = this.props.form;
    if (
      value &&
      !/^1[3|4|5|8][0-9]\d{4,8}$/.test(form.getFieldValue('phone'))
    ) {
      callback('请输入正确的手机号码');
    } else {
      callback();
    }
  };
};

export const deepFlatten = (arr) =>
  [].concat(
    ...arr.map((v) =>
      Array.isArray(v)
        ? deepFlatten(v)
        : typeof v === 'object'
        ? Array.isArray(v.routes)
          ? deepFlatten(v.routes.concat(deleObj(v, 'routes')))
          : v
        : v
    )
  );

// 删除数组置顶元素

export const removeArrItem = (arr, validFunx) => {
  arr.splice(
    arr.findIndex((item) => validFunx(item)),
    1
  );
  return arr;
};

export const parseQueryString = (url) => {
  url = url == null ? window.location.href : url;
  if (url.indexOf('?') === -1) {
    return {};
  }
  const search = url.substring(url.lastIndexOf('?') + 1);
  if (!search) {
    return {};
  }
  return JSON.parse(
    decodeURIComponent(
      '{"' +
        search.replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') +
        '"}'
    )
  );
};

export const QueryString = (obj = {}) => {
  let str = '';
  for (var key in obj) {
    if (obj[key]) {
      str += '&' + key + '=' + obj[key];
    }
  }
  if (str) {
    str = str.slice(1);
  }
  return str;
};

// 根据value 获取key
export const getObjKey = (obj, value) => {
  const arr = Object.entries(obj);
  const values = arr.find((item) => item[1] === value);
  if (values) {
    return values[0];
  }
  return '';
};

export const Format = function (fmt) {
  const self = this;
  //author: meizz
  var o = {
    'M+': self.getMonth() + 1, //月份
    'd+': self.getDate(), //日
    'h+': self.getHours(), //小时
    'm+': self.getMinutes(), //分
    's+': self.getSeconds(), //秒
    'q+': Math.floor((self.getMonth() + 3) / 3), //季度
    S: self.getMilliseconds(), //毫秒
  };
  if (/(y+)/.test(fmt))
    fmt = fmt.replace(
      RegExp.$1,
      (self.getFullYear() + '').substr(4 - RegExp.$1.length)
    );
  for (var k in o)
    if (new RegExp('(' + k + ')').test(fmt))
      fmt = fmt.replace(
        RegExp.$1,
        RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
      );
  return fmt;
};

//通过周取日期范围   year 年   weeks 周
function weekGetDate(year, weeks) {
  var date = new Date(year, '0', '1');
  let start = '';
  let end = '';
  let _start = '';
  let _end = '';
  let cnt = 0;
  let nextYear = '';
  let nextWeek = '';
  let lastcnt = 0;
  var time = date.getTime(); // 获取当前星期几,0:星期一
  var _week = date.getDay(); //当这一年的1月1日为周日时则本年有54周,否则没有54周,没有则去除第54周的提示
  if (_week !== 0) {
    //一年53周情况
    if (weeks === 54) {
      return '今年没有54周';
    }
    cnt = 0; // 获取距离周末的天数
    if (_week === 0) {
      cnt = 7;
    } else if (_week === 1) {
      cnt = 6;
    } else if (_week === 2) {
      cnt = 5;
    } else if (_week === 3) {
      cnt = 4;
    } else if (_week === 4) {
      cnt = 3;
    } else if (_week === 5) {
      cnt = 2;
    } else if (_week === 6) {
      cnt = 1;
    }
    cnt += 1; //加1表示以星期一为一周的第一天    // 将这个长整形时间加上第N周的时间偏移
    time += cnt * 24 * 3600000; //第2周开始时间
    nextYear = new Date(parseInt(year, 10) + 1, '0', '1');
    nextWeek = nextYear.getDay();
    lastcnt = 0; //获取最后一周开始时间到周末的天数
    if (nextWeek === 0) {
      lastcnt = 6;
    } else if (nextWeek === 1) {
      lastcnt = 0;
    } else if (nextWeek === 2) {
      lastcnt = 1;
    } else if (nextWeek === 3) {
      lastcnt = 2;
    } else if (nextWeek === 4) {
      lastcnt = 3;
    } else if (nextWeek === 5) {
      lastcnt = 4;
    } else if (nextWeek === 6) {
      lastcnt = 5;
    }
    if (weeks === 1) {
      //第1周特殊处理    // 为日期对象 date 重新设置成时间 time
      start = Format.call(date, 'yyyy-MM-dd');
      date.setTime(time - 24 * 3600000);

      return start + '-----' + date;
    } else if (weeks === 53) {
      //第53周特殊处理
      start = time + (weeks - 2) * 7 * 24 * 3600000; //第53周开始时间
      end =
        time +
        (weeks - 2) * 7 * 24 * 3600000 +
        lastcnt * 24 * 3600000 -
        24 * 3600000; //第53周结束时间
      date.setTime(start);
      _start = Format.call(date, 'yyyy-MM-dd');
      date.setTime(end);
      _end = Format.call(date, 'yyyy-MM-dd');
      return _start + '---' + _end;
    } else {
      start = time + (weeks - 2) * 7 * 24 * 3600000; //第n周开始时间
      end = time + (weeks - 1) * 7 * 24 * 3600000 - 24 * 3600000; //第n周结束时间
      date.setTime(start);
      _start = Format.call(date, 'yyyy-MM-dd');
      date.setTime(end);
      _end = Format.call(date, 'yyyy-MM-dd');
      return _start + '---' + _end;
    }
  } else {
    //一年54周情况
    cnt = 0; // 获取距离周末的天数
    if (_week === 0 && weeks === 1) {
      //第一周
      cnt = 0;
    } else if (_week === 0) {
      cnt = 7;
    } else if (_week === 1) {
      cnt = 6;
    } else if (_week === 2) {
      cnt = 5;
    } else if (_week === 3) {
      cnt = 4;
    } else if (_week === 4) {
      cnt = 3;
    } else if (_week === 5) {
      cnt = 2;
    } else if (_week === 6) {
      cnt = 1;
    }
    cnt += 1; //加1表示以星期一为一周的第一天
    // 将这个长整形时间加上第N周的时间偏移
    time += 24 * 3600000; //第2周开始时间
    nextYear = new Date(parseInt(year, 10) + 1, '0', '1');
    nextWeek = nextYear.getDay();
    lastcnt = 0; //获取最后一周开始时间到周末的天数
    if (nextWeek === 0) {
      lastcnt = 6;
    } else if (nextWeek === 1) {
      lastcnt = 0;
    } else if (nextWeek === 2) {
      lastcnt = 1;
    } else if (nextWeek === 3) {
      lastcnt = 2;
    } else if (nextWeek === 4) {
      lastcnt = 3;
    } else if (nextWeek === 5) {
      lastcnt = 4;
    } else if (nextWeek === 6) {
      lastcnt = 5;
    }
    if (weeks === 1) {
      //第1周特殊处理
      start = Format.call(date, 'yyyy-MM-dd');
      date.setTime(time - 24 * 3600000);
      // alert(start +'--'+ date);
      return _start + '---' + date;
    } else if (weeks === 54) {
      //第54周特殊处理
      start = time + (weeks - 2) * 7 * 24 * 3600000; //第54周开始时间
      end =
        time +
        (weeks - 2) * 7 * 24 * 3600000 +
        lastcnt * 24 * 3600000 -
        24 * 3600000; //第53周结束时间
      date.setTime(start);
      _start = Format.call(date, 'yyyy-MM-dd');
      date.setTime(end);
      _end = Format.call(date, 'yyyy-MM-dd');
      return _start + '---' + _end;
    } else {
      start = time + (weeks - 2) * 7 * 24 * 3600000; //第n周开始时间
      end = time + (weeks - 1) * 7 * 24 * 3600000 - 24 * 3600000; //第n周结束时间
      date.setTime(start);
      _start = Format.call(date, 'yyyy-MM-dd');
      date.setTime(end);
      _end = Format.call(date, 'yyyy-MM-dd');
      return _start + '---' + _end;
    }
  }
}

export const getRangDays = function (start, end) {
  const msTimeStart = new Date(start.replace('-', '/')).getTime();
  const msTimeEnd = new Date(end.replace('-', '/')).getTime();
  let arr = [];
  let msTimes = [];
  [1, 2, 3, 4, 5, 6, 7].forEach((item) => {
    arr.push(
      moment(msTimeStart + datyTimes * item - datyTimes).format('YYYY-MM-DD')
    );
    msTimes.push(msTimeStart + datyTimes * item - datyTimes);
  });
  return {
    msTimes,
    strDates: arr,
    msTimeStart,
    msTimeEnd,
    start,
    end,
  };
};
/*
const weekObj = getWeekDays(
      moment(new Date()).format('YYYY'),
      moment(new Date()).format('w')
    );

        weekStart: weekObj.start,
        weekEnd: weekObj.end,
*/

// 获取从当天开始的连续七天时间的开始和结束时间。
export const getWeekDays = function (year, week) {
  const datestr = weekGetDate(year, week);
  return getRangDays(...datestr.split('---'));
};
// 获取本周开始时间和结束时间
export const getCurWeekDays = function(dateStr) {
  // 第一步: 获取今天是本周的第几天
const weekOfday = moment(dateStr).format('E');
// 第二步: 获取本周周一的日期
const lastMonday = moment(dateStr).subtract(weekOfday - 1, 'days').format('YYYYMMDD');
// 第三步: 获取本周周末的日期
const lastSunday = moment(dateStr).add(7 - weekOfday, 'days').format('YYYYMMDD');
  return {
    start: lastMonday,
    end: lastSunday
  }
}
export const setHashSearchParams = (hash, value, key = 'curHeadTab') => {
  let keyword = key;
  const patten = new RegExp(keyword + '=[^\\/ | ^&]+', 'ig');
  // const patten = new RegExp(keyword + '=[^\\/]', 'ig');
  if (!hash) {
    return hash + '#/searchParams=' + keyword + '=' + value;
  } else if (hash.indexOf('searchParams') === -1) {
    // 不存在searchParams, 插入searchParams
    return hash.replace(
      /#\//gi,
      '#/searchParams=' + keyword + '=' + value + '/'
    );
  } else if (
    hash.indexOf('searchParams') !== -1 &&
    hash.indexOf(keyword) === -1
  ) {
    // 存在searchParams, 但不存在[keyword]
    // 如果没有mainTab
    return hash.replace(
      /searchParams=/gi,
      'searchParams=' + keyword + '=' + value + '&'
    );
  }
  return hash.replace(patten, keyword + '=' + value);
};

export const getPerWeekDay = (dateStr) => {
  // datyTimes
  if (!dateStr) {
    return dateStr;
  }
  const d = new Date(dateStr.replace('-', '/')).getTime();
  const times = d - datyTimes * 7;
  return moment(times).format('YYYY-MM-DD');
};

export const getNextWeekDay = (dateStr) => {
  // datyTimes
  if (!dateStr) {
    return dateStr;
  }
  const d = new Date(dateStr.replace('-', '/')).getTime();
  const times = d + datyTimes * 7;
  return moment(times).format('YYYY-MM-DD');
};

export const getPerMonth = (dateStr) => {
  // datyTimes
  if (!dateStr) {
    return dateStr;
  }
  const startDate = moment(dateStr)
    .month(moment(dateStr).month() - 1)
    .startOf('month')
    .format('YYYY-MM-DD');
  const endDate = moment(dateStr)
    .month(moment(dateStr).month() - 1)
    .endOf('month')
    .format('YYYY-MM-DD');
  return {
    startDate,
    endDate,
  };
};

export const getNextMonth = (dateStr) => {
  // datyTimes
  if (!dateStr) {
    return dateStr;
  }
  const startDate = moment(dateStr)
    .month(moment(dateStr).month() + 1)
    .startOf('month')
    .format('YYYY-MM-DD');
  const endDate = moment(dateStr)
    .month(moment(dateStr).month() + 1)
    .endOf('month')
    .format('YYYY-MM-DD');
  return {
    startDate,
    endDate,
  };
};
/*

    const month = getCurMonth(new Date());
        monthStart: month.startDate,
        monthEnd: month.endDate,
*/
export const getCurMonth = (dateStr) => {
  // datyTimes
  if (!dateStr) {
    return dateStr;
  }
  const startDate = moment(dateStr)
    .month(moment(dateStr).month())
    .startOf('month')
    .format('YYYY-MM-DD');
  const endDate = moment(dateStr)
    .month(moment(dateStr).month())
    .endOf('month')
    .format('YYYY-MM-DD');
  return {
    startDate,
    endDate,
  };
};

export const getSearchParams = (location, callback) => {
  let hash = location.hash;
  let obj = {};
  // 初始化页面
  // 如果存在hash, 则修改赋值给本地mainTab
  if (hash) {
    // hash = hash + '/searchParams=';
    let hashs = hash.split('/');
    let searchParams = '';
    hashs.forEach((element) => {
      const paramIndex = element.indexOf('searchParams');
      if (paramIndex !== -1) {
        searchParams = element.slice(paramIndex).replace('searchParams=', '');
      }
    });
    // str.replace(/searchParams=[^\/]+/ig, '-----')
    console.log('searchParams', searchParams);
    try {
      obj = parseQueryString('?' + searchParams);
      callback && callback(obj);
      return false;
    } catch {
      callback && callback(obj);
      return false;
    }
  }
  callback && callback(obj);
  return false;
};

相关文章

  • js常用方法库

    /*exp: var obj1 = { a: { name: 'a-1', headers: { token: '...

  • js、nodejs常用库

    js 库名简介loadashjs方法集成库local-storagelocalStorage方法库video.js...

  • 详解a标签中href="javascript:"的几种用法

    一、js 伪协议的几种调用方法 1、a href="javascript:js_method();" 这是常用的方...

  • 日期格式化等方法

    日期格式化和其他常用方法插件 src/assets/js/dateFilter.js 使用方法 直接在js中调用方...

  • 关于js方法的单测

    基于封装的js方法库,了解了chai.js断言库以及Mocha测试框架,下面我简单介绍记录一下,以方便自己回顾。 ...

  • 对象适配器模式

    要解决的问题:没有源码的算法库YY软件公司在很久以前曾开发了一个算法库,里面包含了一些常用的算法,例如排序算法和查...

  • 临时笔记 Vue.js

    Vue.js 常用第三方库 npm install | import from 滚动 better-scroll ...

  • es6方法库

    Number.EPSILON =2^-52 (2.220446049250313e-16); 机器精度 Numb...

  • 测试面试问题记录

    1.前端代码如何区分是CSS还是js 2.常用xpath定位方法 3.Python常用第三方模块 4.HTTP请求...

  • JavaScript网页特效(一)

    介绍常用js的字符串操作api ❤❤❤ 介绍常用js的保留小数操作api ❤❤ 介绍常用js的大小写转换操作a...

网友评论

      本文标题:js常用方法库

      本文链接:https://www.haomeiwen.com/subject/fdjdwhtx.html