[JS]应用splice删除多元素时出现的坑

-------------------------------------------------------------------------------------

先看一个片段:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2,2);  # Banana,Orange

上面两行代码完全没有问题,能达到我们想要的效果。

假如变成了下面这种情况:

var origin=["aa","bb","cc","dd"];
var has = ["bb", "cc"];
var _index = [];

for (i in origin) {
    # 这里或者使用for..in,不是重点
    if ($.inArray(origin[i], has) != -1) {
        _index.push(i);
    }
}

# 重点来了
for (j in _index) {
    origin.splice(_index[j], 1);
}

console.log(origin);  # 现在会输出我们想要的结果 ["aa", "dd"] 吗?

运行一下,我们看到了不是我们想要的结果,原因是执行一次splice,原数组就被更改过了,索引数组的索引重新排列整齐,这样我们记录的老的排列索引就对不上了。

原来是这样。

那么我们现在需要修改一下重点splice部分的代码:

var k = 0;
for (j in _index) {
    origin.splice(_index[j] - k, 1);
    k++;
}

原理是我们缩减索引值,来达到和要删除元素的索引对上的目的。

Link:http://www.cnblogs.com/farwish/p/5204370.html

时间: 2024-08-03 19:23:49

[JS]应用splice删除多元素时出现的坑的相关文章

js动态加载HTML元素时出现的无效的点击事件

项目中列表数据中隐藏着详情数据, 图一: 详情数据是:根据当前行的数据作为参数,通过ajax请求到后台返回的数据,再根据返回的结果动态生成HTML页面 图二: js文件中的这些js的点击事件无效: js代码: // 推荐商家点击标题展开与收起$('.toggle-tag').on('click', function(){    var ele = $(this).parents('tr').next().find('.pro-details');    if(ele.is(':hidden'))

jQuery.inArray和splice删除数组元素

不知道数组下标的情况下,删除数组对应元素.实例: var arrays = ['a','b','c','d']; arrays.splice($.inArray('c',arrays),1); alert(arrays); 结果: a,b,d:

JS 之如何在插入元素时插在原有元素的前面而不是末尾

语法: 父级.insertBefore(新元素,被插入的元素):          //在指定的元素前面加入一个新元素 父级.insertBefore(新元素,父级.children[0]); //在第一个元素的前面插入一个元素,在IE下如果第二个参数的节点不存在,则会报错,若是其他浏览器,则会默认以appendChild的形式添加,不会报错 所以在使用时,需要另作判断:假设新元素是oLi,父元素是oUl if(oUl.children[0] ){ oUl..insertBefore(oUl.c

selenium+python操作js页面,删除某个元素

例子如下:删除元素D下面 readonly属性 d=driver.find_element_by_xpath("//*[@id='divform']/div[2]/ul[2]/li[3]/span[2]/input[1]")driver.execute_script('arguments[0].removeAttribute(\"readonly\")', d);

删除数组元素并重建索引的方法

我们在用unset($arr($k))来删除数组元素时,会发现被删除的值的索引空了,因为业务的需要,我们有时候需要保留索引 有以下两种方法: 方法一:array_values函数 $arr = array(1,2,3,4); unset($arr[1]); echo $array[1]; // error Undefined offset print_r($arr); // 输出如下 /** Array ( [0] => 1 [2] => 3 [3] => 4 ) **/ $arr =

iOS数组的去重,判空,删除元素,删除重复元素 等

一: 去重 有时需要将NSArray中去除重复的元素,而存在NSArray中的元素不一定都是NSString类型.今天想了想,加上朋友的帮助,想到两种解决办法,先分述如下. 1.利用NSDictionary的AllKeys(AllValues)方法 可以将NSArray中的元素存入一个字典,然后利用AllKeys或者AllValues取得字典的所有键或值,这些键或值都是去重的. 示例代码: NSArray *arr = @[@111,@222,@111]; NSMutableDictionary

Javascript:DOM 节点(新建HTML元素/删除HTML元素)

使用DOM可以新建HTML元素,也可以删除已有的HTML元素. 代码整理自w3school:http://www.w3school.com.cn (一)新建元素: <script> //创建新的 <p> 元素 var newEle=document.createElement("p"); //创建文本节点 var node=document.createTextNode("这是使用Javascript创建的新段落."); //将文本节点添加到

JS中彻底删除json对象组成的数组中的元素

只是分享一个小知识~ 在JS中,对于某个由json对象组成的数组,例如: var test = [{ "a": "1", "b": "2" }, { "a": "3", "b": "4" }, { "a": "5", "b": "6" }]; 如果我们想要删除其中的第二

js删除数组元素中的指定值

js删除数组元素中的指定值:所谓删除数组元素中指定的值,就是删除具有指定的数组项,下面就通过实例代码代码介绍一下如何实现此功能.代码如下: var theArray=["蚂蚁部落",2,"青岛市南区","antzone","蚂蚁部落"]; for(var i=0;i<theArray.length;i++){ if(theArray[i]=="蚂蚁部落"){ theArray.splice(i,1);