如何有效地从数组中删除重复值的对象?

时间:2017-03-24 10:07:13

标签: javascript angularjs

为了简化我的问题,假设对象是jqlite对象,使用angular.equals函数,我可以检查它们是否相等。我的问题是:我们如何使用此函数从jqLit​​e对象数组中删除重复项?

以下是我的尝试:

// Suppose jqArr is the array stated above:
var result = [];

angular.forEach(jqArr, function(v_i){
   if(result.length === 0){
      result.push(v_i);
   } else {
      var isPushed = false;
      angular.forEach(result, function(v_j){
         if(angualr.equals(v_i, v_j)){
           isPushed = true;
         }
      });
      if(isPushed === false){
         result.push(v_i);
      }
   }
})
console.log(result);

假设jqArr = [e_1,e_2,e_3,e_1,e_2],其中e_i(s)是jQLite元素。 输出应该是:

[e_1, e_2, e_3]

*请仅使用javascript和angularJs回答。

2 个答案:

答案 0 :(得分:1)

您可以像这样使用ES6 Set

let arr = [1,1,2,2,2,3,4,5,6,6,6,6,6];
let uniq = [...new Set(arr)];

uniq数组将包含唯一值。如果aray充满了对象引用,它自然也会起作用。

答案 1 :(得分:0)

以更抽象的形式,您正在执行O(n^2)算法(与indexOfSet相同),但您可以通过添加所有内容来将复杂性降低到O(nlogn)没有检查的列表中的元素,在收集完所有元素后删除重复项进行排序(排序后只需要一次遍历数组以删除重复项)。

此解决方案仅在您可以存储所有重复项时才有效,因为“复制因子”高于100%,这效率不高。

如果无法执行逻辑排序,则哈希函数可以给出相同的结果。