将每种情况都分别判断一下就好,面向测试用例编程

// 获取url后的参数或传入的url后的参数
function urlQuery(url, key) {
    let params = url.split("?")[1].replace(/\#.*/, '')
    // 判断是否含有参数
    if (params) {
        let paramsList = params.split("&")
        /**
         * 判断是否含有key值
         * 如果含有key值,只需要针对该key值进行修改即可
         */
        if (key) {
            let list = paramsList.filter(val => val.indexOf(key) !== -1)
            // 如果数组有长度,则证明有值
            if (list.length) {
                let result = []
                for (let i = 0; i < list.length; i++) {
                    result.push(list[i].split("=")[1])
                }
                // 如果值不止一个,返回数组
                return result.length > 1 ?
                    result :
                    result[0]
            }
            return ''
        } else {
            let
                // 排序,将一类参数排列在一起
                list = paramsList.sort(),
                // 记录前一个参数值,如果参数值相同,则归类到同一个数组元素中
                preKey = ""
            return list.reduce((pre, next) => {
                let [key, val] = next.split("=")
                if (preKey === key) {
                    // 如果前后两个参数相同,则创建数组并将元素添加进去
                    if (Array.isArray(pre[key])) {
                        pre[key].push(val)
                    } else {
                        pre[key] = [pre[key], val]
                    }
                } else {
                    pre[key] = val
                }
                preKey = key
                return pre
            }, {})
        }
    }
    return ''
}