Skip to content

Instantly share code, notes, and snippets.

@vace
Last active August 19, 2016 06:37
Show Gist options
  • Save vace/3599b260a616fb68b5571173fbe4cc6e to your computer and use it in GitHub Desktop.
Save vace/3599b260a616fb68b5571173fbe4cc6e to your computer and use it in GitHub Desktop.
Given an absolute path for a file (Unix-style), simplify it.
/**
* @param {string} path
* @return {string}
*/
const PATH_START = 0
const PATH_END = 1
const PATH_READ = 2
const PATH_CURRENT = 3
const PATH_PARENT = 4
var simplifyPath = function(path) {
var aim = [],len = path.length,index = 0,char,state = PATH_START,
tmp = ''
while(index < len){
char = path[index]
index += 1
switch (char) {
case '/':
//路径开始
if(state === PATH_READ){
if(tmp){
aim.push(tmp)
tmp = ''
}
}else if(state === PATH_END){ // 已经到结束符号了则直接跳过,xx//xx//
continue
}
state = PATH_END
break;
case '.':
if(state === PATH_END){//进入当前目录 .
state = PATH_CURRENT
}else if(state === PATH_CURRENT){ // 返回上一级 ../
state = PATH_PARENT
aim.pop()
}else if(state === PATH_PARENT){
state = PATH_CURRENT
}else if(state === PATH_READ){
tmp += char
}
break;
default:
tmp += char
state = PATH_READ
break;
}
}
if(state !== PATH_END){
aim.push(tmp)
}
return '/' + aim.join('/')
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment