数组splice细节问题

今天使用 splice又遇到一个没注意到的小坑。先看下它的定义与用法

定义和用法

splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。

注释:该方法会改变原始数组。

语法

arrayObject.splice(index,howmany,item1,.....,itemX)
参数描述
index必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX可选。向数组添加的新项目。

返回值

类型描述
Array包含被删除项目的新数组,如果有的话。

说明

splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。

如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组。

 

 

以前都是匹配到某个数组里面的一项,然后用 arr.splice(i,1)删除掉那项数组元素,然后返回新的数组。例如:

 this.tableData.forEach(item => {
                  item.value.forEach((val,index) => {
                    if(val.id==id){
                      item.value.splice(index,1)
                    }
                  })
                });

这样写并没有什么问题,删除掉数组中那个ID相等的。但是在今天的例子中有所不同。如下:

 var arr=[1]
  for(var i=0;i<arr.length;i++){
    console.log(11111)
    arr.splice(i,1)
  }
  console.log(arr)

这个也还正常,数组中只有一项,删掉以后变为空的数组。

 

var arr=[1,2]
  for(var i=0;i<arr.length;i++){
    console.log(11111)
    arr.splice(i,1)
  }
  console.log(arr)

但是这个就有坑了,数组中只有两项的时候,这样并没有和我所想的一样去执行两次,输出两次console.log(11111),并且数组为空。 仔细想了下,应该是在第一次循环的时候,arr.splice(i,1)截取完成后,arr的长度就已经变成了1,而不再是2了。所以第二次循环并没有去执行。且原先的第二个数组也保留了下来。

也就是说使用arr.splice(i,1)循环数组时,循环次数会比正常的-1次。

所以在使用arr.splice(i,1) 并且再循环中使用时,一定住注意length的变化。

其实单纯使用splice并不会有问题,但是在循环中使用的话,就必须考虑到length的变化。

最后加了一段if(item.value.length==1){
                  item.value.pop();
                }

判断来完成的循环。 

当然完全类似这种需求我就不建议使用splice去做了,不如把符合条件的对象都push到一个新数组里,去操作那个新数组。逻辑会清晰很多。

 this.tableData.forEach(item => {
                let checkArr=[];
                //写一个新数组,去记录没有选中的,然后赋值给item.value
                item.value.forEach((val,index) => {
                  if(!val.checked){
                    checkArr.push(val);
                  }
                });
                item.value=checkArr;
              });
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要删除一个数组中的一个元素,可以使用编程语言提供的相关方法或函数,一般包括以下步骤: 1. 找到需要删除的元素在数组中的位置或索引。 2. 使用数组删除方法或函数,将该位置的元素删除。 3. 如果需要,调整数组中其他元素的位置,以保证数组的连续性。 具体实现方式因编程语言而异。常用的编程语言(如Python、Java、C++等)中,均提供了删除数组元素的相关方法或函数。例如,Python 中可以使用 `del` 关键字或 `pop()` 方法删除数组元素;Java 中可以使用 `System.arraycopy()` 方法将后面的元素向前移动,然后使用 `Arrays.copyOf()` 方法创建一个新数组删除最后一个元素;C++ 中可以使用 `std::vector` 类的 `erase()` 方法删除指定位置的元素。 需要注意的是,在一些编程语言中,数组的长度是固定的,无法直接删除元素,因此需要使用其他数据结构(如链表)来实现删除元素的操作。 ### 回答2: 删除数组中的一个元素可以通过以下步骤实现: 1. 找到要删除的元素的索引。可以使用循环遍历整个数组,逐个比较元素的值,直到找到要删除的元素。 2. 一旦找到要删除的元素的索引,可以使用数组的切片操作来删除元素。将要删除的元素之前的部分和之后的部分重新连接起来,形成一个新的数组。 3. 最后,要记得更新数组的长度或者修改数组的指针位置,以确保数组的正确性。 这是一个简单的例子: ```python # 定义一个包含元素的数组 arr = [1, 2, 3, 4, 5] # 定义要删除的元素的索引 index_to_delete = 2 # 使用切片操作删除元素 new_arr = arr[:index_to_delete] + arr[index_to_delete+1:] # 输出新的数组 print(new_arr) ``` 这个例子中,我们删除了索引为2的元素,即数组中的第3个元素。最后输出的`new_arr`为`[1, 2, 4, 5]`。 当然,还有其他一些删除数组元素的方法和技巧,具体使用哪种方法取决于编程语言和数据结构的细节。 ### 回答3: 要删除数组中的一个元素,我们需要知道该元素的索引位置。删除一个元素的方法有以下几种: 1. 使用splice方法:splice方法可以删除数组中的一个或多个元素,并返回这些被删除元素组成的新的数组。它接受两个参数,第一个参数表示要删除的起始位置,第二个参数表示要删除的元素个数。例如,要删除数组arr中的第i个元素,可以使用arr.splice(i, 1)。 2. 使用delete关键字:delete关键字可以删除数组中指定索引位置的元素,但不调整数组的长度。删除元素后,数组中留下一个空洞。例如,要删除数组arr中的第i个元素,可以使用delete arr[i]。 3. 使用filter方法:filter方法可以根据指定的条件创建一个新的数组,原数组中符合条件的元素将被保留下来。可以通过设置条件来排除需要删除的元素。例如,要删除数组arr中的第i个元素,可以使用arr.filter((_, index) => index !== i)。 需要注意的是,以上三种方法都改变原数组。如果不想修改原数组,可以使用slice方法创建一个新的数组,并在新数组中排除需要删除的元素。例如,要删除数组arr中的第i个元素,可以使用arr.slice(0, i).concat(arr.slice(i+1))。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值