Javascript - 清除数组对象的重复项

时间:2010-12-27 12:55:47

标签: javascript jquery

您好 我有一个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技巧吗?

3 个答案:

答案 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.fooobj["foo"]都引用foo obj属性}。

所以:

  1. 我们从一个没有属性的对象开始。
  2. 当我们遍历数组时,我们会从c1c2创建唯一键。重要的是“--sep--”字符串是无法出现在c1c2中的字符串。如果案例不重要,您可以在那里抛出.toLowerCase
  3. 如果distincts已经拥有该密钥的值,我们知道我们之前已经看过它,我们可以忽略它;否则,我们会在这种情况下添加一个值true,但它可以是除falseundefined0""以外的任何值。作为一个标志,表明我们之前见过这种独特的组合。我们将c3添加到总和中。
  4. 但正如有人指出的那样,你的最后两个条目实际上并不相同;我猜这只是问题上的一个错字......

答案 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)

test

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”创建的代码效率更高。