[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
[JS]应用splice删除多元素时出现的坑的更多相关文章
- js中如何删除某个元素下面的所有子元素?(两种方法)
js中如何删除某个元素下面的所有子元素?(两种方法) 一.总结 方法一:通过元素的innerHTML属性 元素element.innerHTML=""; 方法二:通过元素的remo ...
- js动态加载HTML元素时出现的无效的点击事件
项目中列表数据中隐藏着详情数据, 图一: 详情数据是:根据当前行的数据作为参数,通过ajax请求到后台返回的数据,再根据返回的结果动态生成HTML页面 图二: js文件中的这些js的点击事件无效: j ...
- jQuery.inArray和splice删除数组元素
不知道数组下标的情况下,删除数组对应元素.实例: var arrays = ['a','b','c','d']; arrays.splice($.inArray('c',arrays),1); ale ...
- JS 之如何在插入元素时插在原有元素的前面而不是末尾
语法: 父级.insertBefore(新元素,被插入的元素): //在指定的元素前面加入一个新元素 父级.insertBefore(新元素,父级.children[0]); //在 ...
- JS for循环删除数组元素
$(function(){ var aa = [1,1,2,3,3,4,4,5]; alert(aa); for (var i = aa.length-1;i >= 0 ;i--) { if ( ...
- 关于js中splice方法返回的结果
一.前言 刚刚在使用splice()方法,发现这个方法返回的是删除后的数组元素,如果要获取删除指定元素后的数组,直接调用原来的数组即可!因为splice()会改变原来数组!之前对splice()方法一 ...
- iOS数组的去重,判空,删除元素,删除重复元素 model排序 等
一: 去重 有时需要将NSArray中去除重复的元素,而存在NSArray中的元素不一定都是NSString类型.今天想了想,加上朋友的帮助,想到两种解决办法,先分述如下. 1.利用NSDiction ...
- vue 删除某个元素和删除某些元素
今天做项目使用前端vue框架,需要循环遍历去删除一些数组元素.开始思想局限,一直纠结如何去循环删除,犹豫循环删除数组值下标会发生变化,并不是一种好的方法. 方法一:使用forEach 和 splice ...
- JS中彻底删除json对象组成的数组中的元素
只是分享一个小知识~ 在JS中,对于某个由json对象组成的数组,例如: var test = [{ "a": "1", "b": &quo ...
随机推荐
- access remote libvirtd
访问远程libvirtd服务因为是在一个可信环境中运行,所以可以忽略安全方面的操作,步骤如下:(1)更改libvirtd配置 1.1 更改/ect/sysconfig/libvirtd文件,打开 ...
- HTML 全局属性_02
New : HTML5 新属性. 属性 描述 accesskey 设置访问元素的键盘快捷键. class 规定元素的类名(classname) contenteditableNew 规定是否可编辑元素 ...
- 使用Maven构建多模块项目
[转] 使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为domain(域模型层).dao(数据库访问层).service(业务 ...
- Linux 下没有conio.h 已解决
原文:http://blog.sina.com.cn/s/blog_6a95e00b0100zqvf.html #include <stdio.h>//#include <conio ...
- FPGA奇数分频
在FPGA设计中,分频是很常用的一个基本功能,一般来说,如果需要偶数分频即2次幂的整数倍,这个就很简单了,如2.4.8.16.32.64等这些以2的整数倍的. 这里说的是奇数倍分频,如时钟是100MH ...
- 解决eclipse中安装AIX2插件问题
为了做webservice,查了下,需要用到AXIS2(当然也有别的方法,貌似更复杂,详情可以参看:java开发webservice的几种方式).可试了N次,下载的codegen和service插件始 ...
- Action<T1, T2>委托
封装包含两个参数的方法委托,没有返回值. 语法 public delegate void Action<in T1, in T2>( T1 arg1, T2 arg2 ) 类型参数 in ...
- POJ1061 青蛙的约会-拓展欧几里得
Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事 ...
- c++操作符重载
一.类型转换操作符(type conversion operator)[1] 参考: [1]. C++类型转换操作符(type conversion operator): http://www.cpp ...
- go中方法的接收者是值或者指针的区别
值类型的变量和指针类型的变量 先声明一个结构体: type T struct { Name string } func (t T) M1() { t.Name = "name1" ...