Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
6年前关闭。
我有一个
国家(地区)|城市|数
泰国|普吉岛| 25
泰国|曼谷| 12
中国|温州| 1个
澳大利亚|悉尼| 2
越南|西贡| 4
中国|北京| 3
美国|纽约| 4
美国|迈阿密| 2
如何通过jQuery(或纯JS)获得每个国家/地区的总计,即泰国= 37(25 + 12)?
如果我可以定义每个国家/地区,这将很简单,但是这些值来自数据库,可能超过50个国家/城市,因此需要先将每个国家/地区放入数组中,然后使用inArray并将Number添加到已存在的数组(如果存在) 。
用jsfiddle更新:http://bit.ly/1iizLAt
我假设您可以使用jQuery API遍历表的各行,并获取该行的国家/地区名称;假设您将其放在变量
(请注意,这是假设一个国家没有机会使用
这条线有两种方式看起来有些棘手,因此它是这样工作的:
您可以使用点表示法和属性名称文字(例如
如果查找对象上不存在的属性,则会返回
然后循环遍历
在下面的注释中,ajax333221建议对国家名称进行一些“标准化”,以防万一您同时具有
然后在
想改善这个问题吗? 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
默认存在的任何属性的名称,例如toString
或valueOf
。)这条线有两种方式看起来有些棘手,因此它是这样工作的:
您可以使用点表示法和属性名称文字(例如
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建议对国家名称进行一些“标准化”,以防万一您同时具有
Thailand
和thailand
(由于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