是否有类似于os.path.join的内置javascript函数?

aen*_*nsm 20 javascript python

是否有一个内置的javascript函数,其功能类似于python的os.path.join?我知道我可以通过以下方式加入字符串:

['a', 'b'].join('/')
Run Code Online (Sandbox Code Playgroud)

问题是如果字符串已经包含前导/尾随"/",那么它们将无法正确连接,例如:

['a/','b'].join('/')
Run Code Online (Sandbox Code Playgroud)

编辑: 应该已经指定我正在做这个客户端.

Car*_*ten 12

使用该path模块.path.join正是你要找的.来自文档:

path.join([path1][, path2][, ...])# 将所有参数连接在一起并规范化生成的路径.

参数必须是字符串.在v0.8中,非字符串参数被静默忽略.在v0.10及更高版本中,抛出异常.

例:

path.join('/foo', 'bar', 'baz/asdf', 'quux', '..')
// returns
'/foo/bar/baz/asdf'

path.join('foo', {}, 'bar')
// throws exception
TypeError: Arguments to path.join must be strings
Run Code Online (Sandbox Code Playgroud)

编辑:

我假设你在使用像node.js这样的服务器端Javascript.如果要在浏览器中使用它,可以使用path-browserify.

  • 应该指定,但我问的是客户端。不过,path-browserify 似乎很有用。 (3认同)
  • 行为不同。Python os.path.join 还支持 URI。如果您提供完整的 URI 作为第二个参数,它不会尝试附加该 URI。它将返回 URI。 (2认同)

Rob*_* M. 10

目前没有内置功能可以在防止重复分隔符的同时执行连接.如果你想要简洁,我只想写自己的:

function pathJoin(parts, sep){
   var separator = sep || '/';
   var replace   = new RegExp(separator+'{1,}', 'g');
   return parts.join(separator).replace(replace, separator);
}

var path = pathJoin(['a/', 'b', 'c//'])
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于组合 http:// 链接。例如:pathJoin(['http://google.com/', '/my/path/']) 将返回 http://google.com/my/path,由于 http: /(单斜线) (6认同)
  • @Berty 这是预期的。我不使用 Java,但从名称 `os.path.join` 来看,我假设它用于本地文件系统上的 _file_ 路径。这就是为什么许多语言(包括 JS/Node)有不同的方法来创建 URL 与文件系统的路径。Node 的内置“path”模块执行相同的操作,但是,您可以使用“URL”模块来处理您的示例。 (2认同)

leo*_*leo 7

基于@Berty的回复,此ES6变体保留了所有前导斜杠,以与协议相关的url(如//stackoverflow.com)一起使用,并且还忽略了任何空白部分:

build_path = (...args) => {
  return args.map((part, i) => {
    if (i === 0) {
      return part.trim().replace(/[\/]*$/g, '')
    } else {
      return part.trim().replace(/(^[\/]*|[\/]*$)/g, '')
    }
  }).filter(x=>x.length).join('/')
}
Run Code Online (Sandbox Code Playgroud)
  • build_path("http://google.com/", "my", "path") 将返回 "http://google.com/my/path"
  • build_path("//a", "", "/", "/b/") 将返回 "//a/b"
  • build_path() 将返回 ""


ann*_*neb 6

接受的答案不适用于 URL,它在协议
https://hostname变为https:/hostname.

大多数其他答案不会以不同的方式处理第一部分和最后一部分。不应删除开头或结尾的斜杠,它会改变连接路径的含义(相对/绝对)(文件/目录)。

以下是已接受答案的修改版本:

function pathJoin(parts, sep){
    const separator = sep || '/';
    parts = parts.map((part, index)=>{
        if (index) {
            part = part.replace(new RegExp('^' + separator), '');
        }
        if (index !== parts.length - 1) {
            part = part.replace(new RegExp(separator + '$'), '');
        }
        return part;
    })
    return parts.join(separator);
 }
Run Code Online (Sandbox Code Playgroud)

用法:

console.log(pathJoin(['https://', 'hostname', 'path/'])); // 'https://hostname/path/'
console.log(pathJoin(['relative/', 'path', 'to/dir/']));  // 'relative/path/to/dir/'
console.log(pathJoin(['/absolute/', 'path', 'to/file'])); // '/absolute/path/to/file'
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/tdsLencu/