JScript内置对象Array中元素的删除方法


Posted in Javascript onMarch 08, 2007

我们知道JScript给我们提供了一个内置的数组对象Array。Array对象除了提供了constructor、length和prototype外,还默认提供了13个方法:concat、join、pop、push、reverse、shift、slice、sort、splice、toLocaleString、toString 、unshift和valueOf,可是没有提供delete方法。

    要是熟悉JavaScript的话,会马上说,系统提供了一个delete操作,可以用来删除数组中的元素。对,JS系统里确实有一个delete可以删除数组中的元素。可是这个删除很难用,它确实可以删除元素,可是它却不更新Array对象的元素计数器。例如我们执行:

var ary = ['a', 'b', 'c'];
delete ary[1];
    如果正确的执行删除后,我们希望会得到一个新的数组,他有两个元素['a', 'c'],长度为2。可是执行完后我们确实是得到了两个元素['a', 'c']的数组,可是这个新数组的长度ary.length居然还是3!。同时我们执行ary.toString()将得到"a,,c",这也表明数组的计数器还是3,因为Array的toString()实际上执行的是Array.join(',')。

    这样的删除在我们使用for( ; ; )遍历数组的时候,将会非常的郁闷,我们可能很容易就可能被一个undefined的值搞死掉了。那么怎么才能获得删除数组元素后同步数组的大小呢?由于Array本身提供的pop和shift两个函数可以"真正的"删除数组的元素,所以我们可以使用它们来自己扩充一个remove函数。

    但是pop和shift只能从数组的两端删掉元素,所以我们在删除之前需要对数组做一些整理,实现remove方法的代码如下:

Array.prototype.remove = function(obj)
{
    for ( var i=0 ; i < this.length ; ++i )
    {
        if ( this[i] == obj )
        {
            if ( i > this.length/2 )
            {
                for ( var j=i ; j < this.length-1 ; ++j )
                {
                    this[j] = this[j+1];
                }
                this.pop();
            }
            else
            {
                for ( var j=i ; j > 0 ; --j )
                {
                    this[j] = this[j-1];
                }
                this.shift();
            }    
            break;
        }
    }
};
    移动整理数组的目的只是为了删除元素后不改变剩余元素的彼此相对位置,否则只用把需要删除的元素swap到两端pop或shift以下就可以了。

Javascript 相关文章推荐
js或css文件后面跟参数的原因说明
Jan 09 Javascript
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
Mar 02 Javascript
Javascript的各种节点操作实例演示代码
Jun 27 Javascript
jquery 插件学习(六)
Aug 06 Javascript
form表单只提交数据而不进行页面跳转的解决方案
Sep 18 Javascript
图片翻转效果具体实现代码
Jan 09 Javascript
javascript中clone对象详解
Dec 03 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
Oct 09 Javascript
JavaScript模块规范之AMD规范和CMD规范
Oct 27 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
Nov 23 Javascript
原生的强大DOM选择器querySelector介绍
Dec 21 Javascript
vue项目前端知识点整理【收藏】
May 13 Javascript
在JavaScript中遭遇级联表达式陷阱
Mar 08 #Javascript
原型方法的不同写法居然会影响调试的解决方法
Mar 08 #Javascript
在js中使用&quot;with&quot;语句中跨frame的变量引用问题
Mar 08 #Javascript
JS类库Bindows1.3中的内存释放方式分析
Mar 08 #Javascript
使用IE的地址栏来辅助调试Web页脚本
Mar 08 #Javascript
JScript中的undefined和&quot;undefined&quot;的区别
Mar 08 #Javascript
JavaScript语句可以不以;结尾的烦恼
Mar 08 #Javascript
You might like
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
PHP检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
js之事件冒泡和事件捕获详细介绍
2013/10/28 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
2016/02/28 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
jquery实现网站列表切换效果的2种方法
2016/08/12 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
python实现对一个完整url进行分割的方法
2015/04/29 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
python如何实现反向迭代
2018/03/20 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
详解python分布式进程
2018/10/08 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
小学教师自我剖析材料
2014/09/29 职场文书
行政处罚事先告知书
2015/07/01 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书