- 积分
- 185527
- 最后登录
- 2024-4-18
- 精华
- 0
- 阅读权限
- 255
- 主题
- 250
- UID
- 1004992
- 帖子
- 156603
- PB币
- 213424
- 威望
- 20481
- 贡献
- 3
- 技术
- 142
- 活跃
- 2665
幻想乡中享幸福
- UID
- 1004992
- 帖子
- 156603
- PB币
- 213424
- 贡献
- 3
- 技术
- 142
- 活跃
- 2665
|
发表于 2015-1-18 13:09:07
IP属地福建
|显示全部楼层
本帖最后由 aa65535 于 2015-1-18 13:40 编辑
要解决这个问题的话,基本版是使用 slice() 将需要被插的数组分段然后再使用 concat() 连接,但是这样感觉步骤略繁琐,所以下面介绍点高级的。
说到定点插入元素自然要提一下 splice() 方法:
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目,该方法会改变原始数组。
语法: arrayObject.splice(index,howmany,item1,.....,itemX)
所以 splice() 方法应该可以利用,但是你也会发现,需要插入的是一个个的元素,于是尝试使用递归的方式来写一个方法。- Array.prototype.inset = function(index, array) {
- this.splice(index, 0, array.shift());
- if (array.length === 0) {
- return this;
- }
- this.inset(++index, array);
- };
复制代码 既然写好了,就测试一下吧。
请勿使用多线程下载工具下载论坛附件!
好像工作的挺好 \(*′▽`)/
那么测试一下性能吧……
请勿使用多线程下载工具下载论坛附件!
WTF!! 递归次数太多了 (╯°□°)╯︵ ┻━┻
而且你们有没有发现 push 后返回的是 99995, 说明在 inset 后数组 b 被清空了啊!
这样怎么能好好的用呢,于是继续想 (ˇˍˇ) ~
继续想 (ˇˍˇ) ~
想 (ˇˍˇ) ~
( ′◔ ‸◔') 我记得函数的 apply 方法可以用将参数放在数组里……
( ′◔ ‸◔') 那么我们就来试试吧:- Array.prototype.inset = function(index, array) {
- Array.prototype.splice.apply(this, [index, 0].concat(array));
- return this;
- };
复制代码 注:apply 和 call 都是为了改变某个函数运行时的 context 而存在的,换句话说,就是为了改变函数体内部 this 的指向。与 call 不同的是除了 this 之外,其他参数都需要放在一个数组中。
写好了那就来试试吧,这次直接上大数组吧
请勿使用多线程下载工具下载论坛附件!
第一次执行好像出了点问题,耗时明显不科学,后面两次还是靠谱的,而且数组 b 没变。
第一个方法测试时数组 b 元素个数在 10000 之内是可以工作的,不过耗时也有 2ms, 递归的效率明显还是不行。
大致就是这样,收工!
|
-
6
查看全部评分
-
|