How can I rewrite this simple switch statement to be more concise?
我有一个函数,它返回一个字符串,指示要为特定文件扩展名显示的图像:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | getImage = function (file) { switch (file.extension) { case"txt": return"document.jpg"; case"doc": return"document.jpg"; case"jpg": return"image.jpg"; case"gif": return"image.jpg"; case"png": return"image.jpg"; case"mpg": return"video.jpg"; // And so on for 50+ file extensions... default: return"file.jpg"; } } |
我需要支持大量的文件扩展名,所以我的switch语句很大。但是,由于许多文件扩展名共享相同的图像,我觉得可能有一种方法可以将扩展名组合在一起,使事情更加简洁。
那么,我如何才能以更简洁的方式重新编写这篇文章呢?(任何答案都必须与IE8兼容)
您可以组合案例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | getImage = function (file) { switch (file.extension) { case"txt": case"doc": return"document.jpg"; case"jpg": case"gif": case"png": return"image.jpg"; case"mpg": return"video.jpg"; // And so on for 50+ file extensions... default: return"file.jpg"; } } |
您还可以使用地图:
1 2 3 4 5 6 7 8 9 10 | var extmap = { "txt":"document.jpg", "doc":"document.jpg", "jpg":"image.jpg", "gif":"image.jpg", "png":"image.jpg", "mpg":"video.jpg", // And so on for 50+ file extensions... }; getImage = extmap[file.extension] ||"file.jpg"; |
…但是你不能合并案例。
1 2 3 4 5 6 7 8 9 10 11 12 | getImage = function (file) { var img = ['jpg', 'gif', 'png' ...] , doc = ['doc', 'text' ...] , vid = ['mpg', 'mp4' ...] , ext = file.extension ; if (img.indexOf(ext) >= 0) return 'image.jpg'; if (doc.indexOf(ext) >= 0) return 'document.jpg'; if (vid.indexOf(ext) >= 0) return 'video.jpg'; return 'file.jpg'; } |
1 2 | var types = {"txt":"document.jpg","doc":"document.jpg"} return types[file.extension] |
如其他答案中所述,您可以组合案例。这在您的情况下会更好,因为一个图像映射到多个扩展。另一种可能是使用对象文本:
1 2 3 4 5 6 7 8 | getImage = function (file) { var imageList = { txt:"document.jpg", doc:"document.jpg", // ... }; return imageList[file.extension] ||"file.jpg"; } |
同一返回值可以合并
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | getImage = function (file) { switch (file.extension) { case"txt": case"doc": return"document.jpg"; case"jpg": case"gif": case"png": return"image.jpg"; case"mpg": return"video.jpg"; // And so on for 50+ file extensions... default: return"file.jpg"; } } |
你可以用字典,
1 2 3 4 5 6 7 8 | var format_dict = {"txt":"document.jpg","doc":"document.jpg","mpg":"video.jpg"......}; if (file.extension in format_dict) { return format_dict[file.extension]; } return"file.jpg"; |
如果要使用开关对扩展进行分组,可以使用以下命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | switch (file.extension) { case"txt": case"doc": return"document.jpg"; case"jpg": case"gif": case"png": return"image.jpg"; case"mpg": return"video.jpg"; // And so on for 50+ file extensions... default: return"file.jpg"; } |
你能试试这个吗,你可以把
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | getImage = function (file) { switch (file.extension) { case"txt": case"doc": return"document.jpg"; case"jpg": case"gif": case"png": return"image.jpg"; case"mpg": return"video.jpg"; // And so on for 50+ file extensions... default: return"file.jpg"; } } |
一个简单的解决方案是,如果
1 2 3 4 5 | if( file.extension =="txt" || file.extension =="doc" || ... ) return"image.jpg"; The switch statement is used to perform different action based on different conditions |
在你的情况下,我想如果更好。
您只需在案例中添加逗号,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | getImage = function (file) { switch (file.extension) { case"txt","doc": return"document.jpg"; case"jpg","gif","png": return"image.jpg"; case"mpg": return"video.jpg"; // And so on for 50+ file extensions... default: return"file.jpg"; } |
}