假设我有一个这样的列表:
[ 2, 7, 2, 3, 1, 1, 4, 5, 3, 6, 4 ]
我想排序并删除重复项以产生:
[ 1, 2, 3, 4, 5, 6, 7 ]
我可以先删除重复的然后进行排序:
const uniqueAndSorted = xs => [ ...new Set(xs) ].sort();
但是,这似乎效率很低,因为我在进行排序时可能会检测到重复项。
从列表中排序和删除重复项的最佳方法是什么?
(首选JavaScript实现;该功能应是非破坏性的)
答案 0 :(得分:2)
我不确定这是否适用于所有浏览器,但是您可以执行以下操作:
至少在Chrome中有效:
function getSortedSetArray(arr) {
var map = {};
arr.forEach(function (elem) {
map[elem] = true;
})
return Object.keys(map);
}
答案 1 :(得分:1)
您可以通过执行ES6 Set来实现。
例如:
const uniqueAndSorted = xs => Array.from(new Set(xs)).sort();
uniqueAndSorted([ 2, 7, 2, 3, 1, 1, 4, 5, 3, 6, 4 ])
应该返回[1, 2, 3, 4, 5, 6, 7]
答案 2 :(得分:0)
这可行,但是最好对几种方法进行基准测试:
function uniq_sort(a) {
var seen = {};
return a.filter(function(item) {
return seen.hasOwnProperty(item) ? false : (seen[item] = true);
}).sort();
}
答案 3 :(得分:0)
var myData = [ 2, 7, 2, 3, 1, 1, 4, 5, 3, 6, 4 ];
myData.reduce((x, y) => x.includes(y) ? x : [...x, y], []).sort()
答案 4 :(得分:0)
这取决于您拥有的重复项数量。它只有很少的重复项,然后先进行排序,再删除则更快。另一方面,如果您有很多重复项,则首先创建一个哈希集,然后排序是最佳选择。
来源: What's the most efficient way to erase duplicates and sort a vector?
https://www.geeksforgeeks.org/how-to-sort-a-big-array-with-many-repetitions/
另一种选择是使用“脂肪枢轴快速排序”或“三元分解快速排序”,当输入有很多重复项时,该速度比快速排序快:
https://www.toptal.com/developers/sorting-algorithms/quick-sort-3-way