Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        6年前关闭。
                                                                                            
                
        
我有一个td的表,看起来像这样:


  国家(地区)|城市|数
  
  泰国|普吉岛| 25
  
  泰国|曼谷| 12
  
  中国|温州| 1个
  
  澳大利亚|悉尼| 2
  
  越南|西贡| 4
  
  中国|北京| 3
  
  美国|纽约| 4
  
  美国|迈阿密| 2


如何通过jQuery(或纯JS)获得每个国家/地区的总计,即泰国= 37(25 + 12)?
如果我可以定义每个国家/地区,这将很简单,但是这些值来自数据库,可能超过50个国家/城市,因此需要先将每个国家/地区放入数组中,然后使用inArray并将Number添加到已存在的数组(如果存在) 。

用jsfiddle更新:http://bit.ly/1iizLAt

最佳答案

JavaScript对象本质上是键/值映射,因此即使您事先不知道它们的名称,也可以跟踪这些国家/地区的总数:

要创建地图:

var countryCounts = {};


我假设您可以使用jQuery API遍历表的各行,并获取该行的国家/地区名称;假设您将其放在变量country中。然后,计算一下您已经看到该国家/地区的时间(在循环中):

countryCounts[country] = (countryCounts[country] || 0) + 1;


(请注意,这是假设一个国家没有机会使用Object.prototype默认存在的任何属性的名称,例如toStringvalueOf。)

这条线有两种方式看起来有些棘手,因此它是这样工作的:


您可以使用点表示法和属性名称文字(例如obj.foo)或使用方括号和字符串(例如)在对象上查找属性名称。 obj["foo"]。在后一种情况下,字符串可以是任何表达式的结果。因此,如果country"Thailand",则countryCounts[country]Thailand上查找属性countryCounts
如果查找对象上不存在的属性,则会返回undefined,这是一个“假”值。 JavaScript的curiously-powerful || operator返回您提供的第一个非虚假(真实)参数。因此,如果该值是真实的,则countryCounts[country] || 0会给您countryCounts[country];如果0是假的,则countryCounts[country]会给您。因此,您最终得到的是该国家/地区的当前计数或数字0。然后我们添加一个并存储它。


然后循环遍历countryCounts中的结果:

for (country in countryCounts) {
    if (countryCounts.hasOwnPropery(country)) {
        // Use `country` and `countryCounts[country]`

}


for-in遍历对象的可枚举属性的名称。在这里使用hasOwnProperty有点偏执,但这是一个好习惯。它清除了对象原型上可能存在的所有可枚举的属性。 (Object.prototype上没有可枚举的属性,如果您发现有人添加了任何属性,则应给他们进行严格的交谈,但这仍然是一个好习惯。)



在下面的注释中,ajax333221建议对国家名称进行一些“标准化”,以防万一您同时具有Thailandthailand(由于JavaScript区分大小写,因此这在JavaScript中是单独的属性)。这是一个好主意。至少,我将名称改为小写,他/她的建议是也删除空格,这可能是个好主意,而且不太可能造成混乱。如果您希望这些名称用于显示,则可以将看到的第一个名称(不使其小写并删除空格)存储在单独的地图中:

realCountry = /*...get the real country name...*/;
country = country.toLowerCase().replace(/ /g, '_');
if (!mungedNameMap.hasOwnProperty(country)) {
    mungedNameMap[country] = realCountry;
}


然后在mungedNameMap中查找“ munged”名称,将为您提供您所看到的第一个不受干扰的版本。

09-25 19:28