我得到了一张td
的表格,如下所示:
国家/地区城市|编号
泰国|普吉岛| 25
泰国|曼谷| 12
中国|温州| 1
澳大利亚|悉尼| 2
越南|西贡| 4
中国|北京| 3
美国|纽约| 4
美国|迈阿密| 2
如何通过jQuery(或普通JS)获得每个国家/地区的总数,即泰国= 37(25 + 12)? 如果我可以定义每个国家,但是这些值来自数据库并且可以超过50个国家/城市,那么需要先将每个数据放入数组然后以某种方式使用inArray并添加数字已存在的数组(如果存在)。
使用jsfiddle更新: http://bit.ly/1iizLAt
答案 0 :(得分:3)
JavaScript对象本质上是键/值映射,因此您可以跟踪国家/地区的总数,即使您事先并不知道它们的名称是什么:
创建地图:
var countryCounts = {};
我假设您可以使用jQuery API循环遍历表的行,并获取该行的国家/地区名称;假设你把它放在变量country
中。然后,计算你看到国家的时间(在循环中):
countryCounts[country] = (countryCounts[country] || 0) + 1;
(请注意,这假设某个国家/地区不可能具有Object.prototype
上默认存在的任何属性的名称,例如toString
或valueOf
。)
这条线看起来有点棘手,有两种方式,所以这就是它的工作原理:
您可以使用点表示法和属性名称文字(例如obj.foo
)或使用括号表示法和 上的属性名称> string ,例如obj["foo"]
。在后一种情况下,字符串可以是任何表达式的结果。因此,如果country
为"Thailand"
,则countryCounts[country]
会在Thailand
上查找属性countryCounts
。
如果您查找对象上不存在的属性,则会返回undefined
,这是一个“假”值。 JavaScript的curiously-powerful ||
operator返回你给它的第一个非假(tuthy)参数。因此,如果该值为真,则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
有点偏执,但这是很好的做法;它清除了对象原型中可能存在的任何可枚举属性。 (Thailand
上没有可枚举的属性,如果你有人添加任何属性,你应该给他们一个严厉的谈话,但这仍然是一个好习惯。)
在下面的评论中,ajax333221建议稍微“规范化”国家/地区名称,以防您同时拥有thailand
和realCountry = /*...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;
},{});