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)
更新以包括保罗的评论.谢谢!