嗨,我有一个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}]
Run Code Online (Sandbox Code Playgroud)
我需要避免重复(你可能会看到,最后两个'记录'具有相同的国家和相同的项目)并且总和金额; 如果我从数据库获取数据,我将使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
它是如何工作的:JavaScript对象是映射,并且由于对属性的访问是一种非常常见的操作,一个不错的JavaScript实现试图使属性访问非常快(通过在属性键上使用散列,这种事情).您可以使用一个字符串的名字访问对象的属性,通过使用括号([]),所以obj.foo和obj["foo"]都是指foo的财产obj.
所以:
c1和创建唯一键c2.重要的是"--sep--"字符串是不能出现在c1或中的字符串c2.如果情况不重要,你可以扔.toLowerCase在那里.distincts已经拥有该密钥的值,我们知道我们之前已经看过它,我们可以忽略它; 否则,我们添加了一个值(true在这种情况下,但它可以只是比其他任何事情false,undefined,0,或"")为表明我们以前见过这种独特的组合标志.我们加上c3总和.但有人指出,你的最后两个条目实际上并不相同; 我猜这只是问题上的一个错字......