js在循环遍历数组中删除指定元素踩坑( foreach.. for.. for..in.. )
1、forEach
【1】例子:循环arr数组,将item为1的元素从数组中删除
let arr = [1, 1, 2]
arr.forEach((item, index, arr) => {
if (item == 1) {
arr.splice(index, 1)
}
})
console.log(arr) // [1, 2]
【2】结果:循环之后打印 [1, 2], 还有一个1无法删除
【3】原因分析:
①第一次forEach循环,arr是[1, 1, 2],index是0,item是1,if条件成立,使用splice删除了item1,arr变成[1, 2]
②第二次forEach循环,arr是[1, 2],index是1,item是2,if条件不成立,使用splice无法删除了第二个重复的1
③原因是使用splice容易使数组的index乱序。。。
解决方法
使用filter()方法筛选符合条件的元素,去除不符合条件的元素
//【1】filter()应用到数组上(修改上面的例子,去除为1的元素)
let arr = [1, 1, 2]
arr = arr.filter(item => {
return item != 1
})
console.log(arr) // [2]
//【2】filter()应用到数组对象上(去除对象数组num为0的产品)
let arr = [
{
productId: 1,
productName: '电视机',
num: 20
}, {
productId: 2,
productName: '洗衣机',
num: 0
}, {
productId: 3,
productName: '冰箱',
num: 50
}, {
productId: 4,
productName: '空调',
num: 0
},
]
arr = arr.filter(item => {
return item.num != 0
})
console.log(arr)
2、for..与for..in...
1 /**
2 * 有效的方式 - 改变下标,控制遍历
3 */
4 for (var i = 0; i < arr.length; i++) {
5 if (...) {
6 arr.splice(i, 1); // 将使后面的元素依次前移,数组长度减1
7 i--; // 如果不减,将漏掉一个元素
8 }
9 }
10
11 /**
12 * 无效的方式 - for .. in 无法控制遍历
13 */
14 for (var i in arr) {
15 if (...) {
16 arr.splice(i, 1); // 将使后面的元素依次前移,数组长度减1
17 i--; // 没有效果,怎么都会漏掉一个元素
18 }
19 }
js在循环遍历数组中删除指定元素踩坑( foreach.. for.. for..in.. )的更多相关文章
- ES6数组中删除指定元素
知识点: ES6从数组中删除指定元素 findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引.否则返回-1. arr.splice(arr.findIndex(item => ...
- jq从数组中删除指定元素(根据自定义条件) 超好用的 $.grep() 方法
转: jQuery.grep() 什么是jQuery.grep()? jQuery.grep()是一个查找满足过滤函数的数组元素的函数.原始数组不受影响,返回值为数组. 用法介绍: 写法: jQuer ...
- PHP 从数组中删除指定元素
<?php $arr1 = array(1,3, 5,7,8); $key = array_search(3, $arr1); if ($key !== false){ array_splice ...
- splice从数组中删除指定定数据
/*从数组中删除指定定数据var somearray = ["mon", "tue", "wed", "thur"]so ...
- 学underscore在数组中查找指定元素
前言 在开发中,我们经常会遇到在数组中查找指定元素的需求,可能大家觉得这个需求过于简单,然而如何优雅的去实现一个 findIndex 和 findLastIndex.indexOf 和 lastInd ...
- Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素
ylbtech-Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素 1.返回顶部 1. Java 实例 - 在数组中查找指定元素 Java 实例 以下实例 ...
- js 实现循环遍历数组
for in循环遍历 let arr = [1, 2, 3, 4, 4, 3], str = '' for (const val in arr) { str += val + ' ' } consol ...
- js和jQuery判断数组是否包含指定元素
最近遇见一些前台基础性问题,在这里笔者觉得有必要记录一下,为了以后自己查阅或者读者查看. 已知var arr = ['java','js','php','C++']; 问题:arr数组是否包含‘jav ...
- 【跟着子迟品 underscore】如何优雅地写一个『在数组中寻找指定元素』的方法
Why underscore (觉得这部分眼熟的可以直接跳到下一段了...) 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. ...
- PHP从数组中找到指定元素的位置
群里有人问,有个数组五个元素 分为1到5 现在要求 循环找出3元素的索引,怎么做性能才是最高. 我不知道哪个性能最高,但是我想提出可以用多种方式进行查找,然后进行比较选择. 我想,最简单最基础的 应 ...
随机推荐
- java实现一个接口多个实现类,并且调用指定实现方法@Service
接口 package cn.daenx.framework.notify.sms.service; import cn.daenx.framework.common.vo.system.utils.S ...
- Power BI回顾于2025年
前段时间的工作主要是用Tableau和Tableau CRM,Power BI搁置了好一段时间.为了了解整个行业的趋势,偶尔也会回来看看Power BI这边的动静,毕竟自己当初就是从微软的技术路线开始 ...
- 【C语言/C++】你知道线程安全代码到底是怎么编写的吗?
相信有很多同学在面对多线程代码时都会望而生畏,认为多线程代码就像一头难以驯服的怪兽,你制服不了这头怪兽它就会反过来吞噬你. 夸张了哈,总之,多线程程序有时就像一潭淤泥,走不进去退不出来. 可这是为什么 ...
- 故障诊断:ASM莫名出现GC等待事件、ADG的MRP进程HANG住
我们的文章会在微信公众号Oracle恢复实录和博客网站同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳. ASM环境中有G ...
- USB Gadget设备枚举失败的处理方法
技术背景 我们的板子作为 USB Gadget 设备通过 USB 线接入 USB 主机使用,我们的板子被主机识别为一个 Compsite Device,这个 Compsite Device 是由我们板 ...
- 痞子衡嵌入式:在MDK5.40开发环境下添加用户下载算法FLM文件的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK5.40开发环境下添加用户下载算法FLM文件的方法. 最近痞子衡给一个 RT1170 客户制作了一个 SEGGER 下载算法,在 ...
- vuepress的markdown中引入vue单文件组件
前言 有这个需求,需要封装一些组件 在markdown中使用. 找遍官方文档发现没有,顶多也就支持可以在md里定义<script setup>将md作为一个vue组件去使用 Markdow ...
- 【7】状态压缩DP学习笔记
前言 状态压缩 DP 是一类常用的 DP 方式,思维难度不是很大,但需要一点卡常和实现技巧.比较容易掌握,是一个骗分的好东西. 状态压缩DP 状态压缩 DP 通常用来处理 DP 过程中与具体状态相关的 ...
- iPaaS中API自动化测试的作用
在iPaaS中,API自动化测试的作用主要是有助于验证集成流程的正确性.保证数据一致性.监控和故障排除.性能评估.支持持续集成和持续交付,并增加合作和安全性.通过自动化测试,可以提高iPaaS平台的稳 ...
- Phenomenon•Observation•Uncertainty/Certainty•Statistical law•Random phenomenon•Theory of Probability
Mathematics: the logic of certainty. Statistics: the logic of uncertainty. Certainty/Uncertainty: Ph ...