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

是否有类似于os.path.join的内置javascript函数?,javascript,python,Javascript,Python,是否有一个内置javascript函数,其功能类似于python的os.path.join?我知道我可以用以下方式连接字符串: ['a', 'b'].join('/') 问题是,如果字符串已包含前导/尾随“/”,则它们将无法正确连接,例如: ['a/','b'].join('/') 编辑: 应该指定我正在客户端执行此操作。使用该模块。这正是你要找的 path.join([path1][,path2][,…])35; 将所有参数连接在一起并规范化结果路径 参数必须是字符串。在v0.8中,非字符

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

['a', 'b'].join('/')
问题是,如果字符串已包含前导/尾随“/”,则它们将无法正确连接,例如:

['a/','b'].join('/')
编辑: 应该指定我正在客户端执行此操作。

使用该模块。这正是你要找的

path.join([path1][,path2][,…])35;
将所有参数连接在一起并规范化结果路径

参数必须是字符串。在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
编辑:


我在这里假设您使用的是服务器端Javascript,比如node.js。如果要在浏览器中使用它,可以使用。

当前没有一个内置程序可以执行连接,同时防止重复分隔符。如果你想简洁,我就写你自己的:

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//'])

我解决这个问题的方法是:

var path = ['a/','b'].map(function (i) {
    return i.replace(/(^\/|\/$)/, '');
}).join('/');
第二种方法:

var path = ['a/','b'].join('/').replace(/\/{2,}/, '/')

没有,但是它很容易实现。这也可以用正则表达式来解决,但没有正则表达式也不太糟糕

var pathJoin = function(pathArr){
    return pathArr.map(function(path){
        if(path[0] === "/"){
            path = path.slice(1);        
        }
        if(path[path.length - 1] === "/"){
            path = path.slice(0, path.length - 1);   
        }
        return path;     
    }).join("/");
}

您可能会发现本要点中的代码很有用(即在节点和浏览器中)

//连接路径段。保留首字母“/”并解析“.”和“.”
//不支持使用“.”在根目录之上/之外。
//这意味着join(“foo”,“../../bar”)将不会解析为“../bar”
函数联接(/*路径段*/){
//将输入拆分为路径命令列表。
var部分=[];
for(var i=0,l=arguments.length;i

注意类似的实现(也可以转换为js代码)也存在于

中。这一实现确保它在不删除双斜杠的情况下与http://链接一起工作。 它修剪每个部分开头和结尾的斜线。然后以“/”分隔连接它们

/**
*将两条路径连接在一起,并确保没有任何重复的分隔符
*@param parts要加入的url部分。例如:['http://google.com/“,”/my custom/path/']
*@param separator路径的分隔符,默认为“/”
*@返回{string}组合路径
*/
函数连接路径(部件、分隔符){
return parts.map(函数(part){return part.trim().replace(/(^[\/]*.[\/]*$)/g',);}.join(分隔符|.'/');
}

基于@Berty的回复,此ES6变体保留所有要使用的前导斜杠(如
//stackoverflow.com
),并忽略任何空部分:

build_path=(…args)=>{
返回args.map((部分,i)=>{
如果(i==0){
返回零件.trim().替换(/[\/]*$/g')
}否则{
返回零件.trim().replace(/(^[\/]*|[\/]*$)/g',)
}
}).filter(x=>x.length).join(“/”)
}
  • 构建路径(“http://google.com/“,”我的“,”路径“
    将返回
    ”http://google.com/my/path“
  • build\u路径(“//a”、“”、“/”、“/b/”
    将返回
    “//a/b”
  • build\u path()
    将返回
    “”

注意,这个正则表达式去掉了后面的斜杠。有时,后面的斜杠带有语义含义(例如,表示目录而不是文件),这种区别将在此处丢失。

接受的答案不适用于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);
 }
用法:

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'

以@leo的所作所为为基础:

export function buildPath(...args: string[]): string {
  const [first] = args;
  const firstTrimmed = first.trim();
  const result = args
    .map((part) => part.trim())
    .map((part, i) => {
      if (i === 0) {
        return part.replace(/[/]*$/g, '');
      } else {
        return part.replace(/(^[/]*|[/]*$)/g, '');
      }
    })
    .filter((x) => x.length)
    .join('/');

  return firstTrimmed === '/' ? `/${result}` : result;
}
应涵盖以下情况:

  [
    {
      input: ['/'],
      result: '/',
    },
    {
      input: ['/', 'aaa', ':id'],
      result: '/aaa/:id',
    },
    {
      input: ['/bbb', ':id'],
      result: '/bbb/:id',
    },
    {
      input: ['ccc', ':id'],
      result: 'ccc/:id',
    },
    {
      input: ['/', '/', '/', '/ddd/', '/', ':id'],
      result: '/ddd/:id',
    },
    {
      input: ['', '', '', 'eee', '', ':id'],
      result: 'eee/:id',
    },
  ];

这似乎很好,但您可能还希望替换每个字符串开头的正斜杠。如果path元素具有前导斜杠和尾随斜杠,则第一种方法返回“a//b”,例如,.['/a/',“b']”。@McCroskey您可以通过将正则表达式更改为:/(^\/\/$)/gyou can transfrom(或类似)来修复此问题如果需要的话,可以在节点和浏览器中使用javascript,但我想问的是客户端。不过,path browserify似乎很有用。其行为有所不同。Python os.path.join还支持URI。如果您提供完整的URI作为第二个参数,它将不会尝试附加URI。它将返回URI。原始作品上没有指定许可证,公共域也不是无处不在的东西。这是如此美丽的评论,我希望看到它与适当的许可证(他们应该像sqlite一样,向任何担心公共域风险的人提供1000美元的许可证。这对组合http://links不起作用。例如:pathJoin(['''''./my/path/'))将返回http:/google.com/my/path,由于http:/(单斜杠)的原因,该url无效。)@Berty这是意料之中的。我不使用Java,但从名称
os.path.join
判断,我假设它是用于本地服务器上的文件路径