下面是我用来返回重复元素的方法。但我面临着最危险的性能问题,如浏览器关闭等,当我的数组有大量的项目与长文本..
var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7];
var sorted_arr = arr.sort();
var results = [];
for (var i = 0; i < arr.length - 1; i++) {
if (sorted_arr[i + 1] == sorted_arr[i]) {
results.push(sorted_arr[i]);
}
}
alert(results);
字符串
请建议我做这件事的最好方法
5条答案
按热度按时间des4xlb01#
我没有得到你想要的,但如果你需要返回重复的,你可以使用缓存对象。这适用于数字或字符串或任何东西。
字符串
当然,你也可以做其他事情,比如删除多个项目等。等等。
编辑-我写了一篇关于how to remove duplicates from an array的博客
sdnqo3pr2#
我们有数组
filter
,还有indexOf
和lastIndexOf
,所以你可以不做排序就返回重复的。字符串
n3schb8v3#
假设Nicola的解决方案不适用于您(因为它使用的内存与原始解决方案一样多):在最坏的情况下,输入中的每个元素存储两个元素),您可以使用重复搜索输入的较慢过程。
这需要ECMAScript 5中的
Array.indexOf
方法。很多浏览器都有。有关替代方案,请参见How do I check if an array includes an object in JavaScript?。字符串
这并不比输入
arr
加上输出results
使用更多的内存,但它是一个O(N^2)算法,并且不必修改arr
。hmae6n7t4#
您的方法依赖于排序,这可能是也可能不是您耗尽空间/时间的原因之一。
删除重复项的规范方法是保留键的散列Map(JS中的对象)。你得到的对象键不一定是你想要的顺序;您没有指定是否也要对结果进行排序,但现在它们已经排序了。
你可以
null
出原始数组,因为你不再需要它;当它被收集是由JS引擎虽然。您可以通过将“当前索引”保留到排序数组中来“就地”删除重复项,并且仅当您将非重复元素从计数器索引“向下”移动时才递增它,然后截断您返回的数组。
结合最后两种技术意味着通常只有一个具有有效引用的数组。
length
,因为.slice()
创建一个新数组。字符串
cig3rfwq5#
使用
array.filter()
过滤数组,包括第一次出现索引不同的元素,并作为数组中的最后一次出现。字符串