关于javascript:如何重写这个简单的switch语句更简洁?

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";
}


同一返回值可以合并case

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";
    }

你能试试这个吗,你可以把case语句分组

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";
}

}