如何将这个简单的switch语句重写得更简洁

How can I rewrite this simple switch statement to be more concise?

本文关键字:重写 语句 简洁 switch 简单      更新时间:2023-09-26

我有一个函数,它返回一个字符串,指示要显示的特定文件扩展名的图像:

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兼容)

您可以组合案例:

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

你也可以使用地图代替:

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

但是你不能把案例组合起来。

var types = {"txt":"document.jpg", "doc":"document.jpg"}
return types[file.extension]
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';
 }

您可以将case组合为相同的返回值

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

如其他答案中所述,您可以组合案例。这在您的情况下会更好,因为一个图像映射到多个扩展。另一种可能性是使用对象文字:

getImage = function (file) {
    var imageList = {
        txt: "document.jpg",
        doc: "document.jpg",
        // ...
    };
    return imageList[file.extension] || "file.jpg";
}

如果

if( file.extension == "txt" || file.extension == "doc" || ... )
   return "image.jpg";

The switch statement is used to perform different action based on different conditions

就你而言,我认为如果更好的话。

如果你想使用switch对扩展进行分组,你可以使用这个:

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

您可以使用字典

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

你能试试吗,你可以对case语句进行分组

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

您可以在您的案例中添加逗号,如下所示:

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

}