Javascript 返回数组中重复元素的最佳方法
下面是我用来返回重复元素的方法。。但当我的数组中有大量长文本项时,我会面临最危险的性能问题,如浏览器关闭等Javascript 返回数组中重复元素的最佳方法,javascript,jquery,Javascript,Jquery,下面是我用来返回重复元素的方法。。但当我的数组中有大量长文本项时,我会面临最危险的性能问题,如浏览器关闭等 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(
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);
var-arr=[9,9,111,2,3,4,4,5,7];
var sorted_arr=arr.sort();
var结果=[];
对于(变量i=0;i
请为我推荐一种最好的方法,您的方法依赖于排序,这可能是也可能不是您耗尽空间/时间的原因之一 删除重复项的规范方法是保留键的哈希映射(JS中的对象)。返回的对象键不一定是您想要的顺序;您不需要指定是否也要对结果进行排序,但现在它们已被排序 您可以
null
取出原始数组,因为您不再需要它;但是,当它被收集时,由JS引擎决定
您可以通过将“当前索引”保留在排序数组中来“就地”删除重复项,并且仅当您从计数器索引中“向下”移动一个非重复元素时,才将其递增,然后截断返回的数组
结合最后两种技术应该意味着通常只有一个数组具有有效引用
编辑示例。显式设置length
,如.slice()
创建一个新数组
var have = {};
var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7];
arr = arr.sort();
for (var rIdx = 0, i = 0; i < arr.length; i++) {
if (have[arr[i]]) {
arr[rIdx++] = arr[i];
} else {
have[arr[i]] = true;
}
}
arr.length = rIdx;
console.log(arr);
var have={};
var-arr=[9,9,111,2,3,4,4,5,7];
arr=arr.sort();
对于(var rIdx=0,i=0;i
我不能完全得到您想要的,但是如果您需要返回重复项,可以使用缓存对象。这适用于数字、字符串或其他类型
var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7];
var cache = {};
var results = [];
for (var i = 0, len = arr.length; i < len; i++) {
if(cache[arr[i]] === true){
results.push(arr[i]);
}else{
cache[arr[i]] = true;
}
}
console.log(results);//returns an array with 9 and 4
var-arr=[9,9,111,2,3,4,4,5,7];
var cache={};
var结果=[];
对于(变量i=0,len=arr.length;i
当然,你可以做其他的事情,比如删除多个项目等等
编辑-我在上写了一篇博客文章,假设Nicola的解决方案对你不起作用(因为它使用的内存大约与原始解决方案一样多:输入中每个元素存储两个元素,最坏的情况下),你可以使用重复搜索输入的较慢过程 这需要ECMAScript 5中的
Array.indexOf
方法。很多浏览器都有。有关替代方案,请参阅
var-arr=[9,9,111,2,3,4,4,5,7];
var结果=[];
对于(变量i=0,len=arr.length-1;i
它使用的内存不超过输入
arr
加上输出results
,但它是一个O(N^2)算法,不需要修改arr如果有数组过滤器,还可以使用indexOf和lastinexof,
您可以返回重复项,而无需进行排序
var results, arr= [9, 9, 111, 2, 3, 4, 4, 5, 4, 7];
if(arr.filter){
results= arr.filter(function(itm, i){
return arr.lastIndexOf(itm)== i && arr.indexOf(itm)!= i;
});
}
else// use your loop method
alert(results)
/* returned value: (Array)
9,4
*/
可能重复的数组键是否仅为整数?还有,你的真实阵法和其中的物品有多长?@saifudin-Holy-crap,甚至是同一阵法。这让我相信这是一个关于消费的问题,而不是技术的问题,不是一个重复的问题,更像是一个关于解决另一个问题的问题。此外,这个算法还有一个潜在的错误:如果输入包含N个K的副本,它将返回N-1个K的副本。这个错误目前是隐藏的,因为测试用例中的一个项不超过两个。或多或少我写的是:)@尼古拉佩卢切蒂不太清楚;您还有一个额外的数组。看来你无论如何都会赢;)@DᴀᴠᴇNᴇᴡᴛᴏɴ您能提供一些示例代码吗?:-)@SoI最新答案;不过,您必须进行测试,看看它是否真的解决了问题——我正在测试这个小小的阵列。@dᴀᴠᴇNᴇᴡᴛᴏɴ是的,你可以去掉第二个数组,但我认为这是一个可行的解决方案:它使事情简单明了。当然,这只是我的意见!:)
var results, arr= [9, 9, 111, 2, 3, 4, 4, 5, 4, 7];
if(arr.filter){
results= arr.filter(function(itm, i){
return arr.lastIndexOf(itm)== i && arr.indexOf(itm)!= i;
});
}
else// use your loop method
alert(results)
/* returned value: (Array)
9,4
*/