删除数组中多个不连续的数组元素的正确姿势

本文探讨了JavaScript数组操作的多种方法,包括使用splice、delete和filter函数删除特定元素的技巧,以及在复杂业务数据处理中如何筛选和保留所需数据的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

var arr = ['a', 'a', 'b', 'c', 'd', 'a', 'a', 'e', 'g', 'a', 'f'];

 

我们现在将数组中所有的‘ a’ 元素删除;

arr.forEach(function(key, index) {
key === 'a' ? arr.splice(index, 1) : '';
})

//["a", "b", "c", "d", "a", "e", "g", "f"]

 

只要相邻的‘ a’ 元素, 都没被删除, splice不但可以删除原素本身, 还同时可以减少数组长度( 就是抹去一切痕迹),
这样导致后续的数组元素会代替已经删除的元素的位置, 但是循环是按照数组的下标按顺序删除, 这样就会漏掉迁移的元素。


方法一: delete

arr.forEach(function(key, index) {
key === 'a' ? delete arr[index] : '';
})


//["b", "c", "d", "e", "g", "f"]

可以看到这是我们想要的结果, 因为delete这个方法删除元素时并不会删除本身的位置, 会有个‘ undefind’ 来代替着元素,
这样我们的循环队列的顺序就正常了, 但是这样数组长度是不会有变化的, 这个方法就看自己的需求了


方法二: 取而不删

简单的例子:

var newArr = arr.filter(function(key) {
return key !== 'a'
})


//["b", "c", "d", "e", "g", "f"]

 

一样的结果, 我们的思路就是既然删除是因为我们想要得到符合条件的数组, 那我们直接去筛选符合条件的新数组就解决了!
实际中我们面对的业务数据都是比较复杂的,所以下面的稍微复杂一点

复杂的例子:

 

需求:1 我们需要删除掉checked为"icon-chosen"的所有父项,以及父项中的子项orderDetails。

   2 父项中有多个子项,但如果有一个子项checked是"icon-choose",不是"icon-chosen",那么父项也需要保留下来不被删除。

 

//上面的数据保存在productList中,我们看到只有数组中第一个父元素的第二个子元素checked是"icon-choose"

var newProductList = [];

productList.forEach(function(key) {

  //首先筛选父项"icon-choose",取出我们需要的父项

  if (key.checked == "icon-choose") {

    //筛选子项"icon-choose",取出我们需要的子项

    var newOrderDetails = key.orderDetails.filter(function(keys) {

      return keys.checked == "icon-choose"

  });

    //将符合条件的子项赋值给被筛选的子项

    key.orderDetails = newOrderDetails;

    //将筛选和改变的父项放入新的数组

    newProductList.push(key);
  }

})

console.info(newProductList);

最后的结果就是要保留数组中第一个父元素的第二个子元素checked是"icon-choose",同时保留父元素;数据可能有点多,但其他的只是干扰项,

我们只关注checked属性就好!

 

转载于:https://www.cnblogs.com/xiaojingyuan/p/6220045.html

任务描述 本关任务:定义四种开发中常用的集合并添加数据。 相关知识 为了完成本关任务,你需要掌握: 1.集合的体系结构; 2.如何创建常见的集合。 在前两个关卡中我们学习的ArrayList集合只是集合的一个部分,Java中的集合可没那么简单呢,Java中的集合是一个大家族,接下来我们就来见识一下这个家族吧。 集合的体系结构 Java中的集合分为两大家族,一个是Collection家族,Collection家族有三大成员:List、Queue、Set,这三大成员有三个子类(实际还有很多,这里一一列举)分别是,ArrayList,LinkedList,HashSet,这个家族有一个特点,那就是他们都是单身,集合中的元素都是独立存在的。 另一个就是Map家族了,这个家族的特点就是他们都是成双成对(key和value)一起出现的,让Collection家族很是羡慕啊^_^。 如何使用常见的集合 创建LinkedList集合,并添加数据 LinkedList list = new LinkedList(); list.add("hello"); 创建HashSet集合,并添加数据 HashSet set = new HashSet(); set.add("hello"); 创建HashMap集合,并添加数据 HashMap map = new HashMap(); map.put("name","张三"); 以上就是创建几个常用集合创建实例并添加数据的方式,可以看到我们使用的方式除了LinkedList之外都是父类的引用指向子类对象,相信你还陌生,这个我们在学习多态这个知识点的时候讲过,这种方式可以大大的提高程序的可扩展性。 通过上述代码可以发现Map集合添加数据和Collection家族成员添加数据的方式一样,Map集合添加数据必须有两个,即一个是Key一个是Value。 面试官 Duang Duang Duang面试官来啦,快坐好,摆好姿势。 好了,我要开始提问了: 问:Set集合与List集合有什么区别呢? 答:Set集合中的数据可重复,数据是无序的,List集合的数据可以重复,数据是有序的。 问:就没啦?[严肃脸] 答:哦哦,还有,Set检索效率低下,删除和插入效率高,插入和删除会引起元素位置改变,List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变。 问:Map集合中的元素可以重复吗? 答:可以! 问:你说一说,LinkedList和ArrayList的区别吧。 答:好嘞,LinkedList集合增删速度更快,ArrayList改查更快。 问:咳咳咳,下一位! 答:诶诶诶,别呀,我还没说完呢: ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。LinkedList是双向链表。 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 面试官:嗯,这次算你过关,等下次通知吧! 我:...... 编程要求 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下: 分别定义HashSet、ArrayList、LinkedList、HashMap集合。并向每一个集合中添加www.educoder.net,Map集合的key设置为address,最后将每一个集合返回。 测试说明 补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。 测试输入:无 预期输出: www.educoder.net www.educoder.net www.educoder.net www.educoder.net package step3; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; public class HelloWorld { public HashSet getHashSet(){ /********** Begin **********/ /********** End **********/ } public ArrayList getArrayList(){ /********** Begin **********/ /********** End **********/ } public LinkedList getLinkedList(){ /********** Begin **********/ /********** End **********/ } public Map getHashMap(){ /********** Begin **********/ /********** End **********/ } }
最新发布
03-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值