关于数组中删除元素遇到的问题

数组中删除元素

最开始的想法是调用数组的forEach()方法,根据条件找到的index索引删除该项

问题:
当删除一个元素时,不会发生意外,就可以这样操作,但是当删除数组中多个元素时,这样就会出错了,会出现有些项删不了的情况(还有可能报错)
原因:

我们的需求是将状态为status = 0 的项删除掉:

  • 思路一:那就forEach()遍历数组,找到对应的索引进行删除
let lists = [
    { id: 1,name: "Tom", status: 0 },
    { id: 2,name: "Jack", status: 0 },
    { id: 3,name: "Any", status: 1 },
    { id: 4,name: "Lucy", status: 1 },
    { id: 5,name: "John", status: 0 }
  ];
lists.forEach((item,index) => {
    if(item.status === 0) {
        lists.splice(index,1);
    }
})
console.log(lists);

这样显然不行,因为每当删除一项,数组对应索引的值就会改变

结果如下:

过程:
index=0,时 进入删除,然后进入下一次遍历
index=1,而此时index=1 的项是{ id: 3,name: "Any", status: 1 }
那么也就是说,每当我们有需要删除的项挨在一起时,那么删除项的下一项会被忽略遍历,因为数组本身索引对应的内容改变了。
原因:这是在对本身数组做操作

  • 思路二:我想,那我就对index做一做操作吧
    然后就出现了下面的代码
lists.forEach((item,index) => {
    if(item.status === 0) {
        lists.splice(index,1);
        index --;  
    }
})

想法是:希望每删除一项,就让索引回到删除项,重新遍历

结果是: 还是和之前一样,并没有什么用(发现了好像平时我们不怎么注意的一件事,forEach方法的index我们操作是无效的)

  • 思路三:那么我们就回到原始人吧,用for循环
    那么就出现了以下代码:
for(let i=0;i<lists.length;i++) {
    if(lists[i].status === 0) {
        lists.splice(i,1);
        i--;
    }
}

然后结果就对了。

小结:虽然这是一个小问题,也算是for循环数组和forEach()方法的不同之处了。码住。以后不犯这样的错了

### 如何通过编程语言删除数组中的重复项 以下是几种常见的方法来实现删除有序数组中的重复项,每种方法都附有详细的解释和代码示例。 #### 方法一:暴力法 暴力法的核心思想是对数组进行遍历并逐一比较相邻元素。如果发现两个连续的元素相同,则移除其中一个。这种方法的时间复杂度较高,通常为 O(n²),因为每次调用 `remove` 或类似的函数都会引发后续元素的移动操作[^1]。 ```python def remove_duplicates_violent(nums): i = 0 while i < len(nums) - 1: if nums[i] == nums[i + 1]: del nums[i] else: i += 1 return len(nums) nums = [1, 1, 2, 3, 3, 4] new_length = remove_duplicates_violent(nums) print(f"新长度: {new_length}, 数组: {nums}") ``` --- #### 方法二:双指针法 双指针法是一种更高效的解决方案,时间复杂度为 O(n)。它利用两个索引来分别追踪当前重复元素的位置以及待检查的下一个位置。当遇到同的元素时,将其放置到慢指针所指向的位置上。 ```python def remove_duplicates_two_pointers(nums): if not nums: return 0 slow = fast = 0 while fast < len(nums): if nums[slow] != nums[fast]: slow += 1 nums[slow] = nums[fast] fast += 1 return slow + 1 nums = [1, 1, 2, 3, 3, 4] new_length = remove_duplicates_two_pointers(nums) print(f"新长度: {new_length}, 数组前{new_length}个元素: {nums[:new_length]}") ``` --- #### 方法三:内置函数法 某些高级编程语言提供了现成的数据结构或库函数可以直接用于去重操作。例如,在 Python 中可以借助集合(set)快速完成这一任务。然而需要注意的是,此方法会改变原始数组顺序,因此仅适用于需要保留相对顺序的情况。 ```python def remove_duplicates_builtin(nums): return list(set(nums)) nums = [1, 1, 2, 3, 3, 4] unique_nums = remove_duplicates_builtin(nums) print(f"无序唯一元素列表: {sorted(unique_nums)}") # 如果需要恢复升序则需额外排序 ``` --- #### 方法四:递归法 递归方式虽然如迭代直观简单,但在特定场景下也能发挥作用。其基本逻辑是从头开始逐层判断首元素与其后的子序列是否存在相等情况,并据此构建新的结果集。 ```python def remove_duplicates_recursive(nums): if not nums or len(nums) == 1: return nums[:] first_element = nums[0] rest_elements = remove_duplicates_recursive(nums[1:]) if rest_elements and first_element == rest_elements[0]: return rest_elements else: return [first_element] + rest_elements nums = [1, 1, 2, 3, 3, 4] result = remove_duplicates_recursive(nums) print(f"递归去重后数组: {result}") ``` --- ### 实际应用场景与优化建议 在实际工作中,针对同规模的数据可以选择合适的策略。对于小型数据集,任何一种方法都可以接受;而对于大型数据集,则应优先考虑效率更高的算法如双指针法或者基于哈希表的技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DiuDiu_yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值