你好
我有一个 javascript 数组对象,表示在给定国家/地区销售的商品数量,如下所示:
var data = [{'c1':'USA', 'c2':'Item1', 'c3':100},
{'c1':'Canada', 'c2':'Item1', 'c3':120},
{'c1':'Italy', 'c2':'Item2', 'c3':140},
{'c1':'Italy', 'c2':'Item2', 'c3':110}]
我需要避免重复(如您所见,最后两个“记录”具有相同的国家/地区和相同的项目)并对金额求和;如果我从数据库获取数据,我会使用 DISTINCT SUM 子句,但在这种情况下又如何呢? jquery有什么好的技巧吗?
您可以使用对象作为不同值的映射,如下所示:
var distincts, index, sum, entry, key;
distincts = {};
sum = 0;
for (index = 0; index < data.length; ++index) {
entry = data[index];
key = entry.c1 + "--sep--" + entry.c2;
if (!distincts[key]) {
distincts[key] = true;
sum += entry.c3;
}
}
这是如何运作的:JavaScript 对象是映射,并且由于对属性的访问是极其常见的操作,一个像样的 JavaScript 实现试图使属性访问变得相当快(通过对属性键使用散列,诸如此类的事情)。您可以使用字符串作为名称并使用方括号 ([]
), so obj.foo
and obj["foo"]
两者都指的是foo
的财产obj
.
And so:
- 我们从一个没有属性的对象开始。
- 当我们循环遍历数组时,我们创建唯一的键
c1
and c2
。重要的是“--sep--”字符串应该是cannot出现在c1
or c2
。如果情况不重要,你可能会抛出一个.toLowerCase
在那里。
- If
distincts
该键已经有一个值,我们知道我们以前见过它并且可以忽略它;否则,我们添加一个值(true
在这种情况下,但它可以是除false
, undefined
, 0
, or ""
)作为一个标志,表明我们以前见过这种独特的组合。我们添加c3
到总和。
但正如有人指出的,您的最后两个条目实际上并不相同;我猜这只是问题中的一个拼写错误......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)