是否有类似于os.path.join的内置javascript函数?
是否有一个内置javascript函数,其功能类似于python的是否有类似于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中,非字符
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
判断,我假设它是用于本地服务器上的文件路径