JavaScript遍历数组用splice方法删除元素,这样写可能有遗漏,你遇到过吗?

简介: JavaScript遍历数组用splice方法删除元素,这样写可能有遗漏,你遇到过吗?

在编写“圳品”信息系统中,有时需要对二维数组中的数据进行筛选并删除一些元素,比如删除二维数组中首个元素为0的行。

开始是用for循环访问数组+splice方法删除元素来做:

var a = new Array([0,0,0,0],
                  [1,1,1,1],
                  [0,2,2,2],
                  [0,3,3,3],
                  [4,4,4,4]);

var i;

document.write('<p><strong>2、用for循环访问数组删除首个元素值为0的行:</strong></p>');
for (i=0; i < a.length; i++)
{
  if (0==a[i][0])
  {
    document.write('<p>a['+ i +']=' + a[i] + '…… deleted!</p>');
    a.splice(i,1);
  }
}

运行时发现执行结果有时正常,有时会删除不干净,有遗漏。

检查分析后找到了原因:如果二维数组中连续有两行的首个元素为0的行,比如它们分别是第i行和第i+1行,那么用splice方法删除第i行后,第i+1行就会变成第i行,我们应该继续检查第i行,由于for循环每次循环会自动给循环变量i+1,所以下次循环时不再检查第i行,而是检查第i+1行,这样就造成了遗漏。

改进的办法是用while循环:

var a = new Array([0,0,0,0],
                  [1,1,1,1],
                  [0,2,2,2],
                  [0,3,3,3],
                  [4,4,4,4]);
var i;

document.write('<p><strong>2、用while循环访问数组删除首个元素值为0的行:</strong></p>');
i=0;
while(i < a.length)
{
  if (0==a[i][0])
  {
    document.write('<p>a['+ i +']=' + a[i] + '……删除!</p>');
    a.splice(i,1);
  }
  else
  {
    i++;
  }
}

如果第i行检测到首个元素为0的行则删除,循环变量i不变,进行下一次循环;否则i++。

完整代码如下:

<!DOCTYPE html>
<html>
  <meta name="Author" content="PurpleEndurer">
  <title>“圳品”信息系统</title>
<body>

<script>

var a = new Array([0,0,0,0],
                  [1,1,1,1],
                  [0,2,2,2],
                  [0,3,3,3],
                  [4,4,4,4]);
var i;

document.write('<p style="font-size:16pt; color:purple;"><strong>JavaScript遍历数组用splice方法删除元素,这样写可能有遗漏,你遇到过吗?</strong> @Edge浏览器 by PurpleEndurer</p>');

document.write('<p style="color:blue;"><strong>一、用for循环访问数组+splice方法删除首个元素值为0的行可能有遗漏</strong></p>');
document.write('<p><strong>1、原始数组:</strong></p>');

for (i=0; i < a.length; i++)
{
  document.write((0==a[i][0]) ? ('<p style="color:red;">a['+ i +']=' + a[i] + '</p>')
                                              : ('<p>a['+ i +']=' + a[i] + '</p>') );
}

document.write('<p><strong>2、用for循环访问数组删除首个元素值为0的行:</strong></p>');
for (i=0; i < a.length; i++)
{
  if (0==a[i][0])
  {
    document.write('<p>a['+ i +']=' + a[i] + '…… deleted!</p>');
    a.splice(i,1);
  }
}

document.write('<p><strong>3、处理后的数组:</strong></p>');
for (i=0; i < a.length; i++)
{
  document.write((0==a[i][0]) ? ('<p style="color:red;">a['+ i +']=' + a[i] + '……应删除但未删除</p>')
                                              : ('<p>a['+ i +']=' + a[i] + '</p>') );
}

a = new Array([0,0,0,0],
              [1,1,1,1],
              [0,2,2,2],
              [0,3,3,3],
              [4,4,4,4]);

document.write('<p style="color:blue;"><strong>二、用while循环访问数组+splice方法删除首个元素值为0的行</strong></p>');
document.write('<p><strong>1、原始数组:</strong></p>');

for (i=0; i < a.length; i++)
{
  document.write((0==a[i][0]) ? ('<p style="color:red;">a['+ i +']=' + a[i] + '</p>')
                                              : ('<p>a['+ i +']=' + a[i] + '</p>') );
}

document.write('<p><strong>2、用while循环访问数组删除首个元素值为0的行:</strong></p>');
i=0;
while(i < a.length)
{
  if (0==a[i][0])
  {
    document.write('<p>a['+ i +']=' + a[i] + '……删除!</p>');
    a.splice(i,1);
  }
  else
  {
    i++;
  }
}

document.write('<p><strong>3、处理后的数组:</strong></p>');
for (i=0; i < a.length; i++)
{
  document.write((0==a[i][0]) ? ('<p style="color:red;">a['+ i +']=' + a[i] + '……应删除但未删除</p>')
                                              : ('<p>a['+ i +']=' + a[i] + '</p>') );
}           
</script>

</body>
</html>

运行结果截图如下:

image.png

相关文章
|
1月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
1月前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
1月前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
130 52
|
1月前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
1月前
|
缓存 JavaScript UED
js中BOM中的方法
【10月更文挑战第31天】
|
1月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
47 5
|
1月前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
27 1
|
1月前
|
JavaScript 前端开发
.js方法参数argument
【10月更文挑战第26天】`arguments` 对象为JavaScript函数提供了一种灵活处理参数的方式,能够满足各种不同的参数传递和处理需求,在实际开发中具有广泛的应用价值。
45 7
|
1月前
|
JavaScript 前端开发 图形学
JavaScript 中 Math 对象常用方法
【10月更文挑战第29天】JavaScript中的Math对象提供了丰富多样的数学方法,涵盖了基本数学运算、幂运算、开方、随机数生成、极值获取以及三角函数等多个方面,为各种数学相关的计算和处理提供了强大的支持,是JavaScript编程中不可或缺的一部分。
|
1月前
|
JavaScript 前端开发 开发者