jquery 返回数组中重复元素的最佳方法

xytpbqjk  于 2023-08-04  发布在  jQuery
关注(0)|答案(5)|浏览(145)

下面是我用来返回重复元素的方法。但我面临着最危险的性能问题,如浏览器关闭等,当我的数组有大量的项目与长文本..

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);

字符串
请建议我做这件事的最好方法

des4xlb0

des4xlb01#

我没有得到你想要的,但如果你需要返回重复的,你可以使用缓存对象。这适用于数字或字符串或任何东西。

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

字符串
当然,你也可以做其他事情,比如删除多个项目等。等等。
编辑-我写了一篇关于how to remove duplicates from an array的博客

sdnqo3pr

sdnqo3pr2#

我们有数组filter,还有indexOflastIndexOf,所以你可以不做排序就返回重复的。

var results, arr = [9, 9, 111, 2, 3, 4, 4, 5, 4, 7];

results = arr.filter(function(itm, i){
    return arr.lastIndexOf(itm)== i && arr.indexOf(itm)!= i;
});

console.log(results);

/*  returned value: (Array)
9,4
*/

字符串

n3schb8v

n3schb8v3#

假设Nicola的解决方案不适用于您(因为它使用的内存与原始解决方案一样多):在最坏的情况下,输入中的每个元素存储两个元素),您可以使用重复搜索输入的较慢过程。
这需要ECMAScript 5中的Array.indexOf方法。很多浏览器都有。有关替代方案,请参见How do I check if an array includes an object in JavaScript?

var arr = [9, 9, 111, 2, 3, 4, 4, 5, 7];
var results = [];
for (var i = 0, len = arr.length - 1; i < len; i++) {
  if((results.indexOf(arr[i]) == -1) && (arr.indexOf(arr[i], i + 1) != -1)) {
      results.push(arr[i]);
   }
}
console.log(results);

字符串
这并不比输入arr加上输出results使用更多的内存,但它是一个O(N^2)算法,并且不必修改arr

hmae6n7t

hmae6n7t4#

您的方法依赖于排序,这可能是也可能不是您耗尽空间/时间的原因之一。
删除重复项的规范方法是保留键的散列Map(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);

字符串

cig3rfwq

cig3rfwq5#

使用array.filter()过滤数组,包括第一次出现索引不同的元素,并作为数组中的最后一次出现。

const returnDuplicates = arr => arr.filter((item, index) => arr.indexOf(item) !== index && arr.lastIndexOf(item) === index);

const array = [1, 1, 1, 1, 2, 2, 2, true, true, "hello", "hello"];
console.log(returnDuplicates(array));

字符串

相关问题