js 根据指定的多个索引,删除相应的数组元素。splice + sort
更新于2018-04-19
var productItems = ["a", "b", "c", "d"];
var indexs = [1, 2, 3];
indexs.sort(function(a, b) { return b - a});
indexs.forEach(function(index) { productItems.splice(index, 1) })
将索引集合按照倒序排列,然后splice从数组尾巴开始删除,这样就不会数组的变化就不会影响删除的实现
这里可以直接使用 https://github.com/liyang0612/del-array-value
-----------------------------分割线---------------------------------
昨天遇到一个这样的场景: 有一个不分页的商品列表,里面可能有上千条数据(而且可能是静态数据)甚至更多,这里有个删除功能,需要我们删除其中的一些商品。
这时我的第一反应就是,数据过多不能循环整个数组,只有获取到它们的索引,然后循环得到的索引,使用数组的splice()方法对它进行删除。并且我这样做了,但是发现了一个致命的bug。
bug的原因是这样的: 我先得到了一组索引(就是我所需要删除的商品的索引),然后循环了这组索引,在每次循环的时候我执行了splie()方法,但是由于splice方法执行后会改变数组,所以我的数组长度减少了一;但是我所获取到的索引没有变,从而导致我的第二次splice的时候就出现了bug。
这些我想了另外一个方法:执行一次splice索引应该也减去 “1” 才对,所以我写了这样一个算法;假设所有的索引都为 “n”,并且它们是以正序排列的,那么splice一次之后数组减去 “1”,相应的“n”也减去 “1”;splice第二次之后,“n-2”;第三次之后,“n-3”;
发现这个规律之后我想到的就是,先把所所需要删除元素的索引计算出来。下面是一个例子:
var productItems = ["a", "b", "c", "d"];
var indexs = [1, 2, 3];
//先计算能被正常删除的索引:
var newIndexs = indexs.map(function(val, idx){ return val - idx; })
/**因为splice是从第二次的时候出现bug的,
*所以我们第一个索引的位置是正确的,
*从第二次开始 “n-1”,也就是刚好对应索引数组的索引。**/
newIndexs.forEach(function(index){
productItems.splice(index, 1)
})
productItems //最后得到 ["a"]
这一切都是建立在索引数组是正序排列的情况下,所以计算索引之前,先使用sort方法进行排序;
这样就实现了不循环整个数组,从而删除指定的某些元素。避免了由于数据过大造成的性能问题,毕竟每次删除都去循环几千条数据,这是很恐怖的!!!!
js 根据指定的多个索引,删除相应的数组元素。splice + sort的更多相关文章
- mongo 删除内嵌数组元素
文档格式如下: { "_id" : ObjectId("56e2a92ccc6dd2271953e502"), "links": [ { & ...
- js怎么删除数组元素,有哪些删除元素方法
JavaScript删除元素方法 1.根据索引删除数组元素 delete 数组[索引] *注意delete 后面是空格 var arr1=["aa","bb" ...
- 删除指定表的所有索引,包括主键索引,唯一索引和普通索引 ,适用于sql server 2005,
原文:删除指定表的所有索引,包括主键索引,唯一索引和普通索引 ,适用于sql server 2005, --删除指定表中所有索引 --用法:declare @tableName varchar(100 ...
- js删除数组元素
一.清空数组 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即被清空了 二.删 ...
- js删除数组元素、清空数组的简单方法
一.清空数组 ? 1 2 3 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即 ...
- js中数组元素的添加和删除
js中数组元素常用添加方法是直接添加.push方法以及unshift方法 删除方法则是delete.pop.shift 集修改方法为一身的则是splice 1.添加: (1)直接添加通常都是这样 va ...
- JS数组方法汇总 array数组元素的添加和删除
js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了,先给个我测试的代码^-^ var arr = new Array(); arr[0] = "aaa"; arr[ ...
- vue.js中v-for的使用及索引获取
1.v-for 直接上代码. 示例一: <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- 关于索引删除的策略IndexDeletionPolicy
关于索引删除的策略IndexDeletionPolicy . public IndexWriter(Directory d, Analyzer a, boolean create) ...
随机推荐
- java面试官:兄弟简单谈谈Static、final、Static final各种用法吧
前言 对Static.final.Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从 ...
- 有些需要禁用的PHP危险函数(disable_functions)
phpinfo() 功能描述:输出 PHP 环境信息以及相关的模块.WEB 环境等信息. 危险等级:中 passthru() 功能描述:允许执行一个外部程序并回显输出,类似于 exec(). 危险等级 ...
- 2018.8.14 python中的内置函数(68个)
主要内容: python中68个内置函数的功能及使用方法
- Shiro笔记---身份验证
1.shiro有哪些主要功能 2.搭建shiro环境(*) idea2018.2.maven3.5.4.jdk1.8 项目结构: pom.xml: <dependencies> < ...
- Java线程学习详解
线程基础 1. 线程的生命周期 1.1 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 1 ...
- 使用jieba分析小说人物出现次数
分析: 1. 读取小说,以读的形式打开 with open('文件名.txt','r',encoding='utf8') as f: str = f.read() 2. 切割小说 ret = jieb ...
- [开源]基于goapp+xterm实现webssh-网页上的SSH终端(golang)
简析 基于goapp+xterm实现webssh-网页上的SSH终端. 开源地址见文末. 特性 在网页上实现一个SSH终端.从而无需Xshell之类的模拟终端工具进行SSH连接. 可以对交互命令进行审 ...
- Docker的Ubuntu16.04容器如何汉化
最近发现docker hub中的vnc镜像大部分是没有安装语言包的,试了好多天才把他搞出来. 下面为实现步奏. 网盘软件地址 ://pan.baidu.com/share/link?shareid=3 ...
- 【PyTorch教程】P3. Python学习中的两大法宝函数(当然也可以用在PyTorch)
温馨提示:为了更好的教程体验,提供视频.阅读地址 Youtube: https://www.youtube.com/playlist?list=PLgAyVnrNJ96CqYdjZ8v9YjQvCBc ...
- 没NOIP了?
HSEZ李亮:“考虑一下来HSEZ当艺术生吧!"