开发者

What is the most optimized or simplest way to reduce a file name in javascript

开发者 https://www.devze.com 2022-12-22 07:27 出处:网络
I recently created a function in javascript that takes in a file name and a max character limit where the result needs to follow these rules:

I recently created a function in javascript that takes in a file name and a max character limit where the result needs to follow these rules:

  • Always include file extension
  • If shrinking occurs, leave the first part and last part of the file name intact.
  • Always replace the removed characters with '...'
  • If file length is under the max then do nothing
  • You can assume the max is a least 5 chars long

Now I've already solved this, but it got me thinking if there is a more elegant or simple way to do this in javascript using regular expressions or some other technique. It also gave me an opportunity to try out jsFiddle. So with that in mind here is my function:

function ReduceFileName(name, max){        
if(name.length > max){        
    var e开发者_StackOverflownd = name.substring(name.lastIndexOf('.'));
    var begin = name.substring(0, name.lastIndexOf('.'));
    max = max - end.length - 3;
    begin = begin.substr(0,max/2) + '...' + begin.substr(begin.length-(max/2) , max/2 + 1);
    return begin + end;        
}    
return name;
}

And here it is on js Fiddle with tests


I'm not sure that regular expressions will be necessarily more elegant, but so far I came up with the following which passes your tests:

function ReduceFileName(name, max){        
    if(name.length > max) {
        var ell ="\u2026"; // defines replacement characters
        var ext = (/\.[^\.]*$/.exec(name) || [""])[0]; // gets extension (with dot) or "" if no dot
        var m = (max-ell.length-ext.length)/2; // splits the remaining # of characters
        var a = Math.ceil(m);
        var z = Math.floor(m);
        var regex = new RegExp("^(.{"+a+"}).*(.{"+z+"})"+ext, "");
        var ret = regex.exec(name);
        return ret[1]+ell+ret[2]+ext;
    }
    return name;
}


Since I didn't get much activity on this, I'm assuming there isn't a much better way to do this, so I'll consider my method as the answer until someone else comes up with something else.

function ReduceFileName(name, max){        
if(name.length > max){        
    var end = name.substring(name.lastIndexOf('.'));
    var begin = name.substring(0, name.lastIndexOf('.'));
    max = max - end.length - 3;
    begin = begin.substr(0,max/2) + '...' + begin.substr(begin.length-(max/2) , max/2 + 1);
    return begin + end;        
}    
return name;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号