为了简化我的问题,假设对象是jqlite对象,使用angular.equals函数,我可以检查它们是否相等。我的问题是:我们如何使用此函数从jqLite对象数组中删除重复项?
以下是我的尝试:
// 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回答。
答案 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)
算法(与indexOf
和Set
相同),但您可以通过添加所有内容来将复杂性降低到O(nlogn)
没有检查的列表中的元素,在收集完所有元素后删除重复项进行排序(排序后只需要一次遍历数组以删除重复项)。
此解决方案仅在您可以存储所有重复项时才有效,因为“复制因子”高于100%,这效率不高。
如果无法执行逻辑排序,则哈希函数可以给出相同的结果。