您好 我有一个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技巧吗?
答案 0 :(得分:7)
您可以将对象用作不同值的映射,如下所示:
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实现会尝试使属性访问速度非常快(通过在属性键上使用散列,那种事情)。您可以使用括号([]
)使用字符串作为名称访问对象属性,因此obj.foo
和obj["foo"]
都引用foo
obj
属性}。
所以:
c1
和c2
创建唯一键。重要的是“--sep--”字符串是无法出现在c1
或c2
中的字符串。如果案例不重要,您可以在那里抛出.toLowerCase
。distincts
已经拥有该密钥的值,我们知道我们之前已经看过它,我们可以忽略它;否则,我们会在这种情况下添加一个值true
,但它可以是除false
,undefined
,0
或""
以外的任何值。作为一个标志,表明我们之前见过这种独特的组合。我们将c3
添加到总和中。但正如有人指出的那样,你的最后两个条目实际上并不相同;我猜这只是问题上的一个错字......
答案 1 :(得分:0)
jQuery可能有一个数组函数,但由于你的两个意大利对象并不是非常独特,所以你要求自定义解决方案。你想填充一个数组,并在你去的时候检查它是否重复:
var data = [{'c1':'USA', 'c2':'Item1', 'c3':100},
{'c1':'Canada', 'c2':'Item1', 'c3':120},
{'c1':'Italy', 'c2':'Item2', 'c3':140},
{'c1':'Italy', 'c2':'Item1', 'c3':110}]
var newArray = [];
var dupeCheck = {}; // hash map
for(var i=0; i < data.length; i++){
if(!dupeCheck[data[i].c1]){
newArray.push(data[i]);
dupeCheck[data[i].c1] = true;
}
}
答案 2 :(得分:-1)
HTML:
<div id="test"></div>
JS:
var data = [{'c1':'USA', 'c2':'Item1', 'c3':100},
{'c1':'Canada', 'c2':'Item1', 'c3':120},
{'c1':'Italy', 'c2':'Item2', 'c3':140},
{'c1':'Italy', 'c2':'Item1', 'c3':110}];
var
l = data.length, // length
f = "", // find
ix = "", // index
d = []; // delete
for (var i = 0; i < l; i++) {
ix = data[i].c1 + "_" + data[i].c2 + "__";
//var re = new RegExp(ix);
//if (re.test(f))
if (f.indexOf(ix) != -1)
d.push(i);
else
f += ix;
}
for (var i1 = 0; i1 < d.length; i1++){
$("#test").append("<div>for delete: "+d[i1]+"</div>");
}
修改强>
尽管chrome的工作速度要快得多,但只能在chrome中使用indexOf,而在IE / Opera / Firefox / Safary中使用对象的速度更快。
“@TJ Crowder”创建的代码效率更高。