URL上的查询字符串解析

2021-09-29  本文已影响0人  暖暖1500
const encode = encodeURIComponent;
const decode = decodeURIComponent;
class Query {
  // 解析字符串为字典格式
  resolveQuery(query = window.location.href, extraQuery = {}) {
    if (query) {
      let parsedQuery = {};
      let index = query.indexOf('?');
      query = index !== -1 ? query.slice(query.indexOf('?') + 1) : '';
      query = query.replace(/(\?|\#\/)/g, '&');
      try {
        parsedQuery = this.parsedQuery(query);
      } catch (e) {
        parsedQuery = {};
      }
      for (let key in extraQuery) {
        parsedQuery[key] = extraQuery[key];
      }
      return parsedQuery;
    } else {
      return extraQuery;
    }
  }

  stringifyQuery(obj) {
    const res = obj
      ? Object.keys(obj)
        .sort()
        .map((key) => {
          const val = obj[key];

          if (val === undefined) {
            return '';
          }

          if (val === null) {
            return encode(key);
          }

          if (Array.isArray(val)) {
            const result = [];
            val.slice().forEach((val2) => {
              if (val2 === undefined) {
                return;
              }
              if (val2 === null) {
                result.push(encode(key));
              } else {
                result.push(encode(key) + '=' + encode(val2));
              }
            });
            return result.join('&');
          }

          return encode(key) + '=' + encode(val);
        })
        .filter((x) => x.length > 0)
        .join('&')
      : null;
    return res ? `?${res}` : '';
  }

  parsedQuery(query) {
    const res = {};
    query = query.trim().replace(/^(\?|#|&)/, '');

    if (!query) {
      return res;
    }
    query.split('&').forEach((param) => {
      const parts = param.replace(/\+/g, ' ').split('=');
      const key = decode(parts.shift());
      const val = parts.length > 0 ? decode(parts.join('=')) : '';
      if (key === '') {
        return false;
      }
      if (res[key] === undefined) {
        res[key] = val;
      } else if (Array.isArray(res[key])) {
        res[key].push(val);
      } else {
        res[key] = [res[key]].concat(val);
      }
    });
    return res;
  }
}

const handleQuery = new Query();

export { handleQuery };

上一篇 下一篇

猜你喜欢

热点阅读