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

fra*_*976 2 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}]
Run Code Online (Sandbox Code Playgroud)

我需要避免重复(你可能会看到,最后两个'记录'具有相同的国家和相同的项目)并且总和金额; 如果我从数据库获取数据,我将使用DISTINCT SUM子句,但在这种情况下呢?有什么好的jquery技巧吗?

T.J*_*der 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

它是如何工作的:JavaScript对象是映射,并且由于对属性的访问是一种非常常见的操作,一个不错的JavaScript实现试图使属性访问非常快(通过在属性键上使用散列,这种事情).您可以使用一个字符串的名字访问对象的属性,通过使用括号([]),所以obj.fooobj["foo"]都是指foo的财产obj.

所以:

  1. 我们从没有属性的对象开始.
  2. 当我们遍历数组时,我们从c1和创建唯一键c2.重要的是"--sep--"字符串是不能出现在c1或中的字符串c2.如果情况不重要,你可以扔.toLowerCase在那里.
  3. 如果distincts已经拥有该密钥的值,我们知道我们之前已经看过它,我们可以忽略它; 否则,我们添加了一个值(true在这种情况下,但它可以只是比其他任何事情false,undefined,0,或"")为表明我们以前见过这种独特的组合标志.我们加上c3总和.

但有人指出,你的最后两个条目实际上并不相同; 我猜这只是问题上的一个错字......

  • @Tomalek:在高中打字.;-) (2认同)