gpt4 book ai didi

javascript - 如何删除数组中重复对象的两个实例

转载 作者:行者123 更新时间:2023-11-30 05:33:38 24 4
gpt4 key购买 nike

我有一个对象数组。我试图找到重复的对象,然后删除该对象的两个实例。

现在我正在使用这个方法:

function checkForDups(data){
for(var i = 0; i < data.length; i++){
for(var j = i+1; j < data.length; j++){
if(data[j].number === data[i].number){
data.splice(j,1);
data.splice(i,1);
}
}
}
return data;
}

我认为问题在于它只检查索引大于它正在检查的当前位置的重复项。这意味着不检查数组中位于它“后面”的对象是否有重复。目前我通过这个函数运行数组几次以获得所需的结果。然而,这显然是极其低效的。我怎样才能更有效地达到我想要的结果?

最佳答案

I believe problem is that it only checks for duplicates that have an index that greater than the current position it is checking. This means objects that are "behind" it in the array are not checked for duplication.

不,这只是一个简单的优化,通过相等关系的对称性而成为可能。通过提前搜索并删除您面前的所有重复项,任何当前项目都不能与之前的项目重复,否则它已经被删除了。

但是,有些事情您没有注意:

  • 当从数组中拼接(移除)一个项目时,所有后续的都被移动,并且数组改变它的长度。要真正检查数组中的所有项目,您需要在删除时减少(或:不增加)计数器变量,以便访问现在与删除的项目位于同一位置的新项目(您刚刚删除的位置需要重新访问)。
  • 您可能希望在找到重复项后中断内部循环,否则您会比较并删除完全不同的项。
  • 当数组中有超过 2 个相同类别的重复项时,您没有明确算法应该做什么。当他们的号码是奇数时留下一个?感谢您的评论。
    要删除所有现有的重复项,您需要继续搜索,但不能立即删除第 i 个元素,否则您将没有任何东西可以与 furtheron 进行比较 - 或者您甚至可以删除 >第 i 个项目多次(参见#2)。

所以这个修改应该适合:

function removeAllDups(data) {
// leaves only items in the array that appeared a single time
// removes everything whose .number can be found multiple times
for (var i = 0; i < data.length; i++) {
var found = false,
num = data[i].number;
for (var j = i+1; j < data.length; j++) {
if (data[j].number === num) {
found = true;
data.splice(j--, 1);
}
}
if (found) {
data.splice(i--, 1);
}
}
return data;
}

关于javascript - 如何删除数组中重复对象的两个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25312753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com