使用javascript从数组中删除重复的对象

Lio*_*789 19 javascript arrays sorting algorithm

我试图找出一种有效的方法来从数组中删除重复的对象,并寻找最有效的答案.我环顾互联网,一切似乎都在使用原始数据...或者不能扩展到大型数组.这是我目前的实现,可以改进,并希望尝试避免标签.

 Test.prototype.unique = function (arr, artist, title, cb) {
        console.log(arr.length);
        var n, y, x, i, r;
        r = [];      
        o: for (i = 0, n = arr.length; i < n; i++) {

          for (x = 0, y = r.length; x < y; x++) {

                if (r[x].artist == arr[i].artist && r[x].title == arr[i].title) {
                    continue o;
                }
            }
            r.push(arr[i]);
        }

        cb(r);
    };
Run Code Online (Sandbox Code Playgroud)

并且数组看起来像这样:

[{title: sky, artist: jon}, {title: rain, artist: Paul}, ....]
Run Code Online (Sandbox Code Playgroud)

订单无关紧要,但如果排序使其更有效率,那么我就迎接挑战......

并且对于那些不知道o的人来说是一个标签,它只是说跳回循环而不是推送到新阵列.

纯javascript请没有库.

回答如此:

以下答案的性能测试:http: //jsperf.com/remove-duplicates-for-loops

Hen*_*ijo 30

我知道,问题在于复杂性是平方的.有一个技巧可以做到,它只是使用"关联数组".

您可以获取数组,循环它,并将数组的值添加为关联数组的键.由于它不允许重复键,因此您将自动删除重复项.

由于您在比较时寻找标题和艺术家,您实际上可以尝试使用以下内容:

var arrResult = {};
for (i = 0, n = arr.length; i < n; i++) {
    var item = arr[i];
    arrResult[ item.title + " - " + item.artist ] = item;
}
Run Code Online (Sandbox Code Playgroud)

然后你再次循环arrResult,并重新创建数组.

var i = 0;
var nonDuplicatedArray = [];    
for(var item in arrResult) {
    nonDuplicatedArray[i++] = arrResult[item];
}
Run Code Online (Sandbox Code Playgroud)

更新以包括保罗的评论.谢谢!

  • @ Lion789这是你代码中的一个问题 - 你使用`title`和`artist`设置`arrResult`,但你的示例数组有key1和key2.http://jsfiddle.net/yKwZe/1/ (2认同)