jQuery:从表中获取相同的字符串

时间:2013-11-28 16:18:38

标签: javascript jquery arrays

我得到了一张td的表格,如下所示:

  

国家/地区城市|编号

     

泰国|普吉岛| 25

     

泰国|曼谷| 12

     

中国|温州| 1

     

澳大利亚|悉尼| 2

     

越南|西贡| 4

     

中国|北京| 3

     

美国|纽约| 4

     

美国|迈阿密| 2

如何通过jQuery(或普通JS)获得每个国家/地区的总数,即泰国= 37(25 + 12)? 如果我可以定义每个国家,但是这些值来自数据库并且可以超过50个国家/城市,那么需要先将每个数据放入数组然后以某种方式使用inArray并添加数字已存在的数组(如果存在)。

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

2 个答案:

答案 0 :(得分:3)

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

创建地图:

var countryCounts = {};

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

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

(请注意,这假设某个国家/地区不可能具有Object.prototype上默认存在的任何属性的名称,例如toStringvalueOf 。)

这条线看起来有点棘手,有两种方式,所以这就是它的工作原理:

  1. 您可以使用点表示法和属性名称文字(例如obj.foo)或使用括号表示法和 上的属性名称> string ,例如obj["foo"]。在后一种情况下,字符串可以是任何表达式的结果。因此,如果country"Thailand",则countryCounts[country]会在Thailand上查找属性countryCounts

  2. 如果您查找对象上不存在的属性,则会返回undefined,这是一个“假”值。 JavaScript的curiously-powerful || operator返回你给它的第一个非假(tuthy)参数。因此,如果该值为真,则countryCounts[country] || 0将为您countryCounts[country]提供,如果0为假,则countryCounts[country]将为0。因此,您最终会获得该国家/地区的当前计数或countryCounts。然后我们添加一个并存储它。

  3. 然后在for (country in countryCounts) { if (countryCounts.hasOwnPropery(country)) { // Use `country` and `countryCounts[country]` } 中循环结果:

    for-in

    hasOwnProperty遍历对象的可枚举属性的名称。在这里使用Object.prototype有点偏执,但这是很好的做法;它清除了对象原型中可能存在的任何可枚举属性。 (Thailand上没有可枚举的属性,如果你有人添加任何属性,你应该给他们一个严厉的谈话,但这仍然是一个好习惯。)


    在下面的评论中,ajax333221建议稍微“规范化”国家/地区名称,以防您同时拥有thailandrealCountry = /*...get the real country name...*/; country = country.toLowerCase().replace(/ /g, '_'); if (!mungedNameMap.hasOwnProperty(country)) { mungedNameMap[country] = realCountry; } (在JavaScript中将是单独的属性,因为JavaScript区分大小写)。这是个好主意。至少,我会把名称全部用于小写,他/她的建议也是删除空格,这可能是一个好主意,不太可能造成混淆。如果您希望显示名称,可以在单独的地图中存储您看到的第一个(不会使其成为小写并删除空格):

    mungedNameMap

    然后在{{1}}中查找“munged”名称将为您提供您所见的第一个未经授权的版本。

答案 1 :(得分:0)

我首先以js中可以使用的格式获取数据:

var data = [
  {country: 'Thailand', city: 'Asia', number: 25},
  {country: 'Thailand', city: 'Bangkok', number: 12},
  {country: 'China', city: 'Wenzhou', number: 1},
  {country: 'Australia', city: 'Sydney', number: 2},
  {country: 'Vietnam', city: 'Saigon', number: 4},
  {country: 'China', city: 'Beijing', number: 3},
  {country: 'USA', city: 'New', number: 4},
  {country: 'USA', city: 'Miami', number: 2}
]

完成后,您可以将匹配国家/地区的数字相加:

var counts = {};
for (var i=0; i < data.length; i++){
   var row = data[i];
   counts[row.country] = (counts[row.country] || 0) + 1;
}

或者,如果您想要更实用的方法,可以使用Array.reduce

var counts = data.reduce(function(memo, row){
   memo[row.country] = (memo[row.country] || 0) + 1;
   return memo;
},{});