Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 返回数组中重复元素的最佳方法_Javascript_Jquery - Fatal编程技术网

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
*/