2013-02-18 91 views
1

下面是一个从循环中的数组中提取月份的函数。当找到一个月时,该月在对象CRIMES_PER_MONTH中迭代1。比switch语句更好的解决方案

这可行,但这是一个相当丑陋的解决方案,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适用于数组,我真想把这个作为一个对象。

回答

4

这将是最容易的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; 
} 
+0

有没有办法将转换这个数组完成后,数组到一个对象?我真的需要把它作为一个对象。 – holyredbeard 2013-02-18 09:40:12

+0

当然可以。只需映射对象上的值,然后使用索引到名称的转换来获取属性名称。 – Bergi 2013-02-18 09:44:53

+0

谢谢!工作很好。 – holyredbeard 2013-02-18 09:59:27

2

您可以简单地使用一个数组。

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]++; 
} 
+2

从什么时候开始年有13个月? – Bergi 2013-02-18 09:39:33

+0

他想要1到12个月,但数组中的第一个元素是0,所以他需要13个元素......呃! – 2013-02-18 09:44:28

+0

我很确定,目标通常是将一个集转置回基于0的数组,而不是尝试填充0索引集以匹配问题的范围... – Norguard 2013-02-18 09:49:15

2

如果你想保持目前的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]]++; 
    }; 
}()); 
+0

对象没有顺序,所以你不能确定获得正确的索引。不错,关闭。 – Bergi 2013-02-18 09:40:58

+0

@Bergi只在理论上,但好 - 我更新了答案 – lupatus 2013-02-18 09:46:33

0

只要有一个月的名称的数组,你抬头。

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 
0

我在这里错过了什么吗?

它的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; 
} 
相关问题