如何从arrayList中删除重复的对象值(Jquery/Javascript)

3
我有一个包含对象的arrayList。当对象具有相同的值时,我需要仅显示一个值。
例如:[{a:0,b:1},{a:1,b:0},{a:0,b:1}] 从上面的例子中,我只需要展示第一个和第二个对象,并跳过第三个对象,因为它与第一个对象相同。
注意:数组中的对象可以是无限的,我不能硬编码索引值。谁能帮助我找到通用解决方案。
这是我尝试过的内容:
points = [];
newarr = [];
locArray = [ {a:0,b:1},{a:1,b:0},{a:0,b:1} ];

if(abc!=null){
removeDuplicateCoordinates();
                        $.each(newarr,function(key,val){
                           points.push([val.a,val.b]);

                        });

}

function removeDuplicateCoordinates(){
                var arr = locArray;
                $.each(arr, function(index,item){
                    if(searchForItem(newarr,item)<0){
                        newarr.push(item);
                    }
                });
            }
            function searchForItem(array, item){
                var i, j, current;
                for(i = 0; i < array.length; ++i){
                    if(item.length === array[i].length){
                        current = array[i];
                        for(j = 0; j < item.length && item[j] === current[j]; ++j);
                        if(j === item.length)
                            return i;
                    }
                }
                return -1;
            }

请查看以下解决方案:http://jsperf.com/remove-duplicates-from-an-array-of-strings-javascript,http://jsperf.com/dedup-int-array。希望您能轻松采纳它们。如果不行,请选择您喜欢的一个,我们会尝试实现它。 - Alexander Arutinyants
@AlexanderArutinyants:你能否按照我提供的结构进行实现。我很难理解你提供的参考链接。 - user4217999
你应该保留源数组吗? - Alexander Arutinyants
3个回答

2

点此查看演示
试一下这个

    newarr = [];
    testarr = [];
    locArray = [ {a:0,b:1},{a:1,b:0},{a:0,b:1} ];
    for (var i = 0; i<locArray.length;i++)
        {
    var idx = $.inArray(String(locArray[i].a)+String(locArray[i].b), testarr);
    if (idx == -1) {
      testarr.push(String(locArray[i].a)+String(locArray[i].b));
      newarr.push(locArray[i]);
        }
     }
    console.log(newarr);

1
我的一个最喜欢的方法:

usedArray = {};
locArray = [ {a:0,b:1},{a:1,b:0},{a:0,b:1} ];
for (key in locArray) {
    if (usedArray[JSON.stringify(locArray[key])] == undefined) {
        console.log(JSON.stringify(locArray[key]));
        usedArray[JSON.stringify(locArray[key])] = true;
    }
}

不知道它有多快,但每次都能为我工作。工作 fiddle
而不是 console.log(JSON.stringify(locArray[key]));,您可以填充新数组:
newarr.push(locArray[key]);

编辑

fiddle中测试100000个对象的宽度,大约需要300毫秒的时间,我可以接受这个速度。


Json stringify 在循环中使用是相当耗费资源的操作,你不这么认为吗? - Alexander Arutinyants
1
@AlexanderArutinyants 是的,它很笨重,然而一切都取决于locArray包含多少元素。再加上一些优化,就可以表现得不错了。 - Bogdan Kuštan
同意,这总是取决于情况,过早优化是有害的 :) - Alexander Arutinyants

0
首先,Array.indexOf() 不会比较对象。 我们知道
在 JavaScript 中,对象是一种引用类型。即使它们具有相同的属性,两个不同的对象也永远不相等。只有将同一对象引用与自身进行比较才会得出 true。
因此,在我看来,最简单且最快的方法是自己进行比较。 这里是工作中的 JSFiddle
var locArray = [{ a: 0, b: 1 }, { a: 1, b: 0 }, { a: 0, b: 1 }];

//We will try to find if point alrady exists in array
Array.prototype.indexOfPoint = function(point) {
    for (var i = 0; i < this.length; i++) {
        var arrPoint = this[i];
        if (arrPoint.a === point.a && arrPoint.b === point.b)
            return i;
    }
    return -1;
};

Array.prototype.uniquePoints = function() {
    var a = [];
    for (var i = 0; i < this.length; i++) {
        var currentPoint = this[i];
        if (a.indexOfPoint(currentPoint) < 0) {
            a.push(currentPoint);
        }
    }
    return a;
};

var newarr = locArray.uniquePoints();
console.log(newarr);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接