编辑代码

function transformAbsolutePath(_url, _relativepath) {
    if (!_relativepath) return _relativepath
    const url = new URL(_url)
    const pathname = url.pathname
    const pathnameArr = pathname.split('/')
    const relativepathArr = _relativepath.split('/')
    let newUrl = ''
    if (/^\.\.\//.test(_relativepath)) {
        const relativepathFilterArr = relativepathArr.filter(s => s !== '..')
        const count = relativepathArr.length - relativepathFilterArr.length
        const pathnameSliceArr = pathnameArr.slice(0, pathnameArr.length - count)
        newUrl = pathnameSliceArr.concat(relativepathFilterArr).join('/')
    } else if (/^\/[^\/]/.test(_relativepath)) {
        newUrl = _relativepath
    } else {
        const relativepathFilterArr = relativepathArr.filter(s => s !== '.')
        newUrl = pathnameArr.concat(relativepathFilterArr).join('/')
    }
    return url.origin + newUrl
}

const url = 'https://www.demo.com/a/b/c/d'
// 返回上两级
const relativePath1 = '../../foo'
// 下一级
const relativePath2 = './bar'
// 根子级
const relativePath3 = '/foobar'

// 'https://www.demo.com/a/b/foo'
const absolutePath1 = transformAbsolutePath(url, relativePath1)

// 'https://www.demo.com/a/b/c/d/bar'
const absolutePath2 = transformAbsolutePath(url, relativePath2)

// 'https://www.demo.com/foobar
const absolutePath3 = transformAbsolutePath(url, relativePath3)


console.log({ absolutePath1, absolutePath2, absolutePath3 })