使用sort加个简单的算法,不循环整个数组而删除数组内的某些元素。

昨天遇到一个这样的场景: 有一个不分页的商品列表,里面可能有上千条数据(而且可能是静态数据)甚至更多,这里有个删除功能,需要我们删除其中的一些商品。

这时我的第一反应就是,数据过多不能循环整个数组,只有获取到它们的索引,然后循环得到的索引,使用数组的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[index].splice(index, 1)

})

productItems  ===>  ["a"]

这一切都是建立在索引数组是正序排列的情况下,所以计算索引之前,先使用sort方法进行排序;

这样就实现了不循环整个数组,从而删除指定的某些元素。避免了由于数据过大造成的性能问题,毕竟每次删除都去循环几千条数据,这是很恐怖的!!!!

时间: 2024-10-01 12:37:59

使用sort加个简单的算法,不循环整个数组而删除数组内的某些元素。的相关文章

算法-利用object的key唯一性删除数组重复项

# 利用object的key唯一性删除数组重复项 # uniq.html <!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title>   <script type="text/javascript">        var arr=[12,34,2

几种简单排序算法

最简单的排序算法——冒泡排序: 1 void bubble_sort(int *arr, int len) 2 { 3 int up, down; 4 for(up = 0; up != len; ++ up) 5 { 6 for(down = 0; down != len - up - 1; ++ down) 7 { 8 if(arr[down] > arr[down + 1]) 9 swap(arr[down], arr[down + 1]); 10 } 11 } 12 } 还有一种思路,就

简单线性回归算法

/**  * 简单线性回归算法  * @param array y轴数据  * @param array x轴数据  * @returns array(slope,intercept,r2)  */ function linearRegression(y, x) {     var lr = {};     var n = y.length;     var sum_x = 0;     var sum_y = 0;     var sum_xy = 0;     var sum_xx = 0;

基于BP神经网络的简单字符识别算法自小结(C语言版)

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:[email protected] 写在前面的闲话: 自我感觉自己应该不是一个很擅长学习算法的人,过去的一个月时间里因为需要去接触了BP神经网络.在此之前一直都认为算法界的神经网络.蚁群算法.鲁棒控制什么的都是特别高大上的东西,自己也就听听好了,未曾去触碰与了解过.这次和BP神经网络的邂逅,让我初步掌握到,理解透彻算法的基本原理与公式,转为计算机所能识别的代码流,这应该就是所谓的数学和计

约瑟夫问题 算法很简单保证每隔人都能看懂用数组实现 利用循环删除数组中的元素

#include<iostream> using namespace std; const int size = 1000; void ArrDel() { int arr[size]; //循环结束标志,一直循环到数组中只剩下最后一个元素结束 int currentNum = size; int count = 0; for (int k = 0; k < size; k++) { arr[k] = k; } //currentNum==1表示数组中只剩下最后一个元素 是循环结束的标志

在 asp.net mvc中的简单分页算法

//第一步:建立如下分页实体类:namespace MVCPager.Helpers { /// <summary> /// 简单分页算法类 /// </summary> public class Pager { public int RecordCount { get; set; } public int PageIndex { get; set; } public int PageSize { get; set; } public int PageCount { get { r

简单的算法和排序

今天总结了下排序简单的算法 [自定义排序]先寻找一个最小的数,然后依次那这个数和数组中其他数字比较,如果发现比这个数字小的数就把这两个数调换位置,然后再继续寻找下一个最小的数字进行下一轮比较 var arr = [31,6,19,8,2,3]; function findMin(start,arr){ var iMin = arr[start]; var iMinIndex = start; for(var i = start+1;i<arr.length;i++){ if(arr[i]<iM

DES、3DES 加解密;MAC算法

/// <summary> /// DES.3DES 加解密:MAC算法 /// </summary> public sealed class DES_Cryptographycs { #region --- 字段 Begin --- private PaddingMode mPaddingMode; private CipherMode mCipherMode; private byte[] mbyKey; private byte[] mbyIV; #endregion ---

模块加载简单实现

代码仍有问题,就是导入jQuery后无法使用$问题.想参考RequireJS的做法(先去研究下): require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){ // some code here});本代码为原创,但有一些部分参考阮一峰老师的博客和RequireJS源码. 注意Test.html中在测试ModuleLoader之前先通过<script type="text/javascript"