繁体   English   中英

比switch语句更好的解决方案

[英]Better solution than a switch statement

下面是一个从循环中提取一个月的函数。 找到一个月后,对象CRIMES_PER_MONTH中的月份将被迭代1。

这行得通,但是这是一个非常丑陋的解决方案,并且switch语句变得很长。 那么,我可以用什么代替switch语句呢?

var crimes_per_month = {
          january: 0,
          february: 0,
          mars: 0,
          april: 0,
          may: 0,
          june: 0,
          july: 0,
          august: 0,
          september: 0,
          oktober: 0,
          november: 0,
          december: 0
};

function AddToMonths(month) {

    switch(month) {

        case 1:
            jan += 1;
        break;

        case 2:
            feb += 1;
        break;

        case 3:
            mar += 1;
        break;

        case 4:
            apr += 1;
        break;

        ... and so on...

    }
}

for(var i = 0; i < incidents.length; i++) {
    month = incidents[i].substring(5, 7);
    AddToMonths(parseInt(month));
}

我想最好的办法是直接在循环中访问对象:

for(var i = 0; i < incidents.length; i++) {
    month = incidents[i].substring(5, 7);
    crimes_per_month[month] += 1;
}

...但是这个ony适用于数组,我真的很想把它作为一个对象。

最简单的方法是将crimes_per_month为数组,以便可以使用给定addToMonths的键直接处理其属性:

crimes_per_month = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
function addToMonths(month) {
    crimes_per_month[month-1] += 1;
}

如果您不希望这样做,则需要进行索引到月名称的转换功能。

var crimes_per_month = {
    january: 0,
    february: 0,
    mars: 0,
    april: 0,
    may: 0,
    june: 0,
    july: 0,
    august: 0,
    september: 0,
    oktober: 0,
    november: 0,
    december: 0
};

function addToMonths(month) {
    var names = ["january", "february", "mars", "april", "may", "june", "july", "august", "september", "oktober", "november", "december"];
    var name = names[month-1];
    crimes_per_month[name] += 1;
}

您可以简单地使用数组。

var crime_per_month = new Array(13);
for(var i = 1; i <= 12; i++) crime_per_month[i] = 0;
function AddToMonths(month) {
    crime_per_month[month]++;
}

如果您希望保留当前的CRIMES_PER_MONTH结构,则可以使用带有键的数组将月份编号转换为键名称:

var addToMonths = (function () {
    var names = ["january", "february", "mars", "april", "may", "june", "july", "august", "september", "oktober", "november", "december"];
    return function (month) {
        CRIMES_PER_MONTH[names[month - 1]]++;
    };
}());

只需查找一个月名称数组即可。

var months = ["january", "february", ...],
    month = incidents[i].substring(...),

    incident_month = months[month-1]; // case 1: === "january"

 crimes_per_month[incident_month] += 1; // case 1: === crimes_per_month.january += 1

我在这里明显错过了什么吗?

它是JavaScript,因此(几乎)所有内容都允许;)

为什么不访问对象成员呢? 您需要在同一个成员名称crimes_per_monthincidents_month ,应该能够只是像做:

var crimes_per_month = {january: 0,...};
var incidents_month = {january: 14,....};

function addToMonth(/* string */ monthName) {
  crimes_per_month[monthName] = crimes_per_month[monthName] + 1;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM